Java基础&源码解析
Java基础&源码解析
袁小黑
这个作者很懒,什么都没留下…
展开
-
Java后台线程/守护线程/服务线程
Thread.setDaemon(true)开启守护线程,守护线程就是在后台运行的线程,它会随着父线程结束而结束。 Daemon 线程中产生的新线程也是 Daemon 的。当 JVM 中所有的线程都是守护线程的时候, JVM 就可以退出了;如果还有一个或以上的非守护线程则 JVM 不会退出。可以看下面的代码:public class DaemonThreadTest { public static void main(String[] args) { new Thread(()-原创 2020-11-04 17:24:09 · 388 阅读 · 0 评论 -
有三个线程怎么保证顺序性
保证顺序性其实就是java多线程通信的问题。三个线程协定执行的先后顺序,转换成线程通信的问题,我需要用一个东西来协定执行到哪个线程了,这东西实现方式就有很多了:Java的线程通信都是使用内存共享变量的方式,那么就简单的方式就是:一个共享变量。这个共享变量可以是一个简单的静态变量,可以是一个Semaphore等。其实如果考虑抢锁会消耗性能,如果我不跑的线程进行挂起呢?实现方式22)线程的wait和notify如果对底层了解一点,我个人理解性能最高的方式其实是直接使用LockSupport.pa原创 2020-11-04 16:07:54 · 937 阅读 · 0 评论 -
因为多线程,我怼了一个同事
背景:今天同事在看我写锁同步的总结,兴致来了想考考我,问我synchronized 保证变量的可见性吗?我回答可以,他的答案是synchronized不保证可见性,volatile才保证可见性。结果两人起来争执,为此他特意写了如下代码来证明他说的是正确的:重点戏/** * 证明,synchronized能不能保重对象可见性。 */public class SynchronizedLock { private static int count = 0; public void原创 2020-11-04 15:26:25 · 1395 阅读 · 14 评论 -
总结每天10问之java多线程1
Java 多线程1、Java中实现多线程有多少种方式:答:继承Thread;2)实现接口Runnable;3)FutureTask4)线程池2、sleep()和wait() 有什么区别?答:sleep不会释放对象锁,wait会释放对象锁。sleep会自我唤醒,wait需要notify/notifyAll。3、volatile是什么?可以保存有序性吗?答:volatile是Java多线程解决可见性的问题提供的一个保留关键字,使用它可以保证多线程访问时该变量的可见性。可以保证部分有原创 2020-11-04 14:36:03 · 163 阅读 · 0 评论 -
总结每天10问之序列化
1、什么是序列化?答:序列化我的理解是我们看到的数据转化成二进制bytes流向磁盘,网络。并经过磁盘、网络之后另外个时间点/另外一个操作系统进行反序列化,将二进制的bytes流翻译成我们能理解的数据格式;比如:json格式。上面是大白话的回答:下面是官方回答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化不仅仅局限于语言,而是网络、操作系统方面原创 2020-11-02 17:41:24 · 133 阅读 · 0 评论 -
总结每天10问之Java基础3
Java 基础OOP相关21、讲讲类的实例化顺序?答:执行clinit方法什么是clinit得等到jvm篇讲解的时候讲方便点,这里就记住clinit是class的static 变量,final变量,static代码块这些就好。clinit方法不是每个class都有的,Object就没有。包括两个步骤:1)执行父类的clinit方法。2)执行子类的clinit方法。clinit里面具体的执行逻辑是:① 执行static filed②执行static 代码块执行init方法(构造原创 2020-11-01 18:02:24 · 126 阅读 · 0 评论 -
总结每天10问之Java基础2
Java 基础OOP相关11、什么是拆装箱?答:在理解拆箱和装箱之前需要理解一个概念:基本类型和封装类型,比如int是基本类型,integer是封装类型(包装器类型)。基本类型其实对应到c++或者直接说内存中的某个数据具体样子。int比integer占的内存小的多,integer的功能比int多得多。这两者之间jdk为我们提供了一些转换的方式:拆装箱。这是jdk5之后提供的,为的就是让基本类型和jdk封装类型之间能自动转换。这种自动转换也叫自动拆装箱。在Java SE5之前,如果要生成一个数原创 2020-10-29 17:34:53 · 139 阅读 · 2 评论 -
总结每天10问之Java基础1
Java 基础OOP相关1、什么是B/S架构?什么是C/S架构答:B/S中B是Brower,浏览器的意思;S是Server,即Brower/Server,用户通过浏览器访问服务。C/S中C是Client,客户端的意思;Client的范围很大,可以包括浏览器,但是一般情况都是桌面定制。2、Java都有那些开发平台?答:1)Java SE:主要用在客户端开发2)Java EE:主要用在Wef服务器开发3)Java ME:主要用在嵌入式开发3、JDK和JRE的区别答:1)JDK:Java原创 2020-10-29 16:59:35 · 122 阅读 · 0 评论 -
ThreadLocal原理解析
个人理解ThreadLocal的原理得结合Thread和ThradGroup体系才能解释清楚。这是一个自底向上的讲解,所以请各位耐心看到最后,才能明白ThreadLocal的原理。关于ThreadGroup和Thread源码的分析,请看我前面的文章。Thread之中有如下两个属性:public class Thread implements Runnable { /* ThreadLocal values pertainingz(有关) to this thread. This map is原创 2020-07-19 22:59:04 · 258 阅读 · 0 评论 -
Thread源码解析
多线程编程一直是业界公认比较难也是比较重要,而且是非常基础的一点,掌握它非常重要。Java中多线程编程比较幸福,因为Jdk工程师们考虑了很多东西尽量减少使用Java的难度和复杂度。其实在C++之中是没有内建多线程的,它依赖操作系统提供这个特性,因为C++为了效率,控制C++适用的应用程序的范围。即C++没有内建多线程,它允许你直接使用操作系统提供的多线程。这也意味着你在Linux系统下编写的C++多线程代码很有可能在Windows下不能运行,这也是架构师技术选型的时候一个重要考虑点。这边文章不是针对整.原创 2020-07-19 22:56:11 · 1828 阅读 · 0 评论 -
ThreadGroup源码解析
ThreadGroup 是对Java对Thread的一种组织方式。每一个ThreadGroup都是Thread的集合。ThreadGroup是一个以树状结构维护的一个数据结构。再我们虚拟机一开始启动的时候就初始化一个Root ThreadGroup给我们,所有的线程都在这Root ThreadGroup下面。ThreadGroup重要的属性如下:public class ThreadGroup implements Thread.UncaughtExceptionHandler { /**原创 2020-07-19 22:46:56 · 260 阅读 · 0 评论 -
Jdk之中的二分查找法
闲逛看代码,看到了JDK之中实现的二分查找法。这里做一下介绍:直接看源码/** * Searches the specified list for the specified object using the binary * search algorithm. The list must be sorted into ascending order * according to the specified comparator (as by the * {.原创 2020-07-16 21:43:56 · 491 阅读 · 0 评论 -
Java线程的6种状态及切换(透彻讲解)
Java中的线程的状态分为6种。初始(NEW):新创建了一个线程对象,但还没有调用start()方法。运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的成为“运行”。 线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(r...转载 2018-07-05 15:28:40 · 791 阅读 · 0 评论 -
Java7相对于Java6的新变化
1. 允许switch语句中使用String表达式Java7之前,switch的条件表达式类型只能是枚举类型,或者byte、char、short、int类型已或者Byte、Character、Short和Integer。Java7之后允许条件表达语句是String类型了。2. 允许数值以下划线分割Java7之后下面的代码是合法的:long a = 10_000_000L;i...原创 2018-09-02 16:32:47 · 1276 阅读 · 0 评论 -
JDK集合
本文以Java10为背景,Java8到Java10只是增加了一些方法,总体结构没变。 转载请注明:https://blog.csdn.net/ydonghao2/article/details/82221628Tal.Yuan在写了解集合之前,我们先了解一下在Java中(或者C++中也一样)的一种模式:一般对interface 和 abstract class和 class之间的...原创 2018-08-30 15:21:07 · 447 阅读 · 0 评论 -
Java流与文件
Java中I/O操作主要是指使用Java进行输入,输出操作。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。流 在JavaAPI中,可以从其中读入一个字节序列的对象称做输入流,而可以向其中写入一个字节...原创 2018-09-02 19:03:25 · 8164 阅读 · 0 评论 -
泛型
目录泛型三种形式泛型继承规则通配符类型无限定通配符泛型实现原理:类型擦除特殊的擦除:桥方法泛型的意义:使得程序具有更好的可读性和安全性。泛型三种形式泛型类:public class Axxx<T> {} ,public interface Iterable<T>泛型方法:public static <T> getMiddl...原创 2018-08-26 11:51:15 · 321 阅读 · 0 评论 -
Iterator,Iterable,ListIterator
本文以Java10为背景,Java8到Java10只是增加了一些方法,总体结构没变。 转载请注明:https://blog.csdn.net/ydonghao2/article/details/82223381Tal.Yuan身为一个集合:那么遍历集合中的元素是最基本的功能,JDK提供了一个iterator迭代器,可迭代接口等。Iterator和Iterable ...原创 2018-08-31 10:44:28 · 258 阅读 · 0 评论 -
【Java】奇怪的考试题:128与127对于==(等于号)的不同区别研究!
为什么128 == 128返回为False,而127 == 127会返回为True? 这是我们今天要讨论的话题,因为我觉得它非常的有趣。如果你运行如下代码:class A{ public static void main(String[] args) { Integer a = 128, b = 128; System.out...转载 2018-08-12 21:12:11 · 632 阅读 · 0 评论 -
Java8里面的java.util.Spliterator接口有什么用
首先先直接给一个答案:Spliterator(splitable iterator可分割迭代器)接口是Java为了并行遍历数据源中的元素而设计的迭代器,这个可以类比最早Java提供的顺序遍历迭代器Iterator,但一个是顺序遍历,一个是并行遍历从最早Java提供顺序遍历迭代器Iterator时,那个时候还是单核时代,但现在多核时代下,顺序遍历已经不能满足需求了...如何把多个任务分配到不同核...转载 2018-07-26 18:06:51 · 831 阅读 · 0 评论 -
Java IO各种类型接口
JDK各种IO各种类型接口。IO的各种类型的接口AutoCloseable和Closeable详情见:https://blog.csdn.net/ydonghao2/article/details/82316191 Flushable:Flushable 是可刷新数据的目标地。调用 flush 方法将所有已缓冲输出写入底层流。这个接口对OutputStream没有任何作用,只对Wr...原创 2018-09-02 18:08:29 · 2770 阅读 · 0 评论 -
HashMap的内存利用率
有规律的整数/字符串 @Test public void testHashSize() { HashMap<String, Integer> inte = new HashMap<>(1); for (int i = 0; i < 100000000; i++) { inte.put(i , ...原创 2018-09-11 12:32:51 · 1911 阅读 · 0 评论 -
平方数之和
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。示例1:输入: 5输出: True解释: 1 * 1 + 2 * 2 = 5示例2:输入: 3输出: False解题思路:这个解题思路可以参考:两数之和 II - 输入有序数组 题目的解法:时间复杂度为o(根号n)空间复杂度为o(1)代码如下:public class Ju...原创 2019-07-15 23:16:51 · 807 阅读 · 0 评论 -
两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15], ta...原创 2019-07-15 22:42:59 · 153 阅读 · 0 评论 -
Spring中的Transactional中为什么会有readOnly=true
Transactional是spring中集成的事务,事务有着ACID的特性。A原子性在update,insert的时候都作用比较明显。为什么Spring在Transactional中会有一个readOnly呢?我们来做一个实验:首先造一些数据: @Test public void testInsertBatch() { //insert 十万的数据 ...原创 2019-07-14 19:28:35 · 874 阅读 · 0 评论 -
Groovy 的精髓 —— 闭包
闭包的进化过程在Groovy中可以使用闭包这种特殊的类型,闭包其实声明格式就是一个:{ } 括起来的代码块。接近java类型的代码class Example { static void main(String[] args) { def clos = {println "Hello World"}; // 最好下载一下源码,从里面可以看到Groovy的...原创 2019-05-23 19:51:31 · 237 阅读 · 0 评论 -
Java继承关系的理解
首先有一个基类 Thingpublic class Thing { public Thing() { System.out.println("Everything begins here!"); }}然后有个子类命名为Shape(形状)继承Thingpublic class Shape extends Thing { public String ...原创 2019-04-29 12:50:59 · 790 阅读 · 0 评论 -
受检异常与非受检异常
参考编写 https://www.imooc.com/article/275564Java中异常的分类所有异常,都继承自java.lang.Throwable类。Throwable有两个直接子类,Error类和Exception类。Throwable 是所有异常类型的基类,Throwable 下一层分为两个分支,Error 和 Exception.Error 和 ExeptionE...转载 2019-02-09 18:17:02 · 1069 阅读 · 0 评论 -
主副表之间相互对应的工具类
背景 在工作的过程中经常遇到一种场景:某个查询要求效率比较高,而且需要的数据分布在不同的表之中,往往我们需要查询一个主表拿到数据之后,再拿主表的id或者其它识别符号去查询从表的数据。 为了查询效率比较高,那么我们查从表的时候如果使用for循环去查找效率会比较慢,这个可以验证。这个时候推荐使用in语句查询一次性把所有的结果找出来再在内存中做匹配。 ...原创 2019-01-10 13:12:42 · 317 阅读 · 0 评论 -
基本类型和对象类型之间的转换消耗
举个例子:Long 和long之间的转换:public class Sum { // Hideously slow program! Can you spot the object creation? public static void main(String[] args) { long t1 = System.currentTimeMillis(); Long sum...原创 2018-09-13 15:10:44 · 490 阅读 · 0 评论 -
不安全的单例模式
单例模式实现有很多种方式,常说的有比较节约内存的懒汉模式,实现比较简单的恶汉模式。单例模式目的是整个内存这个class只能有一个对象即可,但是这传统的模式并不意味这是安全的。传统单例模式:public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } pu...原创 2018-09-13 14:58:49 · 759 阅读 · 0 评论 -
PreventDuplicated
package com.tal.multithread;import javafx.geometry.Pos;import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import ja...转载 2018-07-11 17:06:25 · 233 阅读 · 0 评论 -
JavaThreadGroup
所有的Thread都有ThreadGoup,同线程存在父子关系,ThreadGroup也存在父子关系。如图: 林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 摘要:线程组ThreadGroup表示一组线程的集合,一旦一个线程归属到一个线程组之中后,就不能再更换其所在的线程组。那么为什么要使用线程组呢?个人认为有以下的好处:方便...转载 2018-07-11 15:48:33 · 311 阅读 · 0 评论 -
Map族系——HashMap
本文以Java10为背景,Java8到Java10只是增加了一些方法,总体结构没变。 转载请注明:https://blog.csdn.net/ydonghao2/article/details/81079249TalBen目录Hash()tableSizeFor()HashMap的FieldHashMap的构造方法核心方法put()resize()Tre...原创 2018-07-19 10:44:51 · 286 阅读 · 0 评论 -
内部类详解
1、定义 一个类的定义放在另一个类的内部,这个类就叫做内部类。 public class First { public class Contents{ public void f(){ System.out.println("In Class First's inner Class Contents method f()"); } } }转载 2014-11-26 22:40:07 · 537 阅读 · 0 评论 -
静态变量
关键字static 1、static是静态的,可以用来修饰属性,方法,代码块(或初始化块)、*内部类。static修饰属性。1)、static修饰属性(也称为类变量):由类创建的所有对象都共用这个属性,当其中一个对象对此属性进行修改,会导致其它对象的调用有变化。2)、类变量随着类的加载而加载,不依赖于对象,并且是独一份。类变量的加载时早于对象。3)、可以通过类来调用静态...原创 2014-11-04 16:07:59 · 467 阅读 · 0 评论 -
代码块
1、类的成员:初始化块(代码块)初始化块(代码块)也是类的第四个成员(属性,方法,构造器)。1、代码块如果有修饰的话,那么只能使用static。2、分类:静态代码块,非静态代码块class Order { private int orderId; private String orderName; //初始化块(代码块) { orderId = 1002; ...原创 2014-11-04 18:26:47 · 417 阅读 · 0 评论 -
基本类型之间的相互转换
包装类Wrap2、包装类及String、基本数据类型之间的相互转换。int ——》 Integer int i = 10;System.out.println(i); //基本数据类型 ————————> 对应的包装类:调用包装类的构造器Integer i1 = new Integer(i);System.out.println(i1.toStrin...原创 2014-11-04 15:25:14 · 394 阅读 · 0 评论 -
Java修饰符访问权限
1. 类(class) 可见性修饰符: public—在所有类中可见,在其他包中可以用import导入。 缺省—就是没有修饰符,在同一个包中的类中可见,在其他包中不能用import导入。 修饰符:final—终态类,表示该类不能被继承 abstract—抽象类,不能新建对象 2. 变量(variable) Java中变量有两种,方法变量和字段变量 方法变量只能用一个修...原创 2014-10-31 09:32:24 · 390 阅读 · 0 评论 -
异常处理
1、IO文件不存在 import java.io.FileNotFoundException;import java.io.FileReader;public class TestError { public static void main(String[] args) throws FileNotFoundException { FileReader f...原创 2014-11-06 11:12:20 · 417 阅读 · 0 评论