- 博客(6)
- 收藏
- 关注
原创 Java类的延迟初始化
双重检验锁: public class SafeDoubleCheckedLocking { private volatile static Instance instance ; public static Instance getInstance(){ if(instance == null){ // synchronized (SafeDoubl
2021-05-07 16:16:11
234
原创 volatile的实现
volatile有两个作用,一个是保证变量在各线程之间的可见性,另一个是禁止指令重排。 可见性: 本质上就是线程之间通过主内存进行通信的问题,假如说有两个线程A和B,线程A写这个volatile变量,线程B读这个变量,在A写完以后,JMM把该线程的本地内存变量刷新到主内存里面,B在读的时候通过总线嗅探机制发现自己的本地内存变量已经过期,B就从主内存读取共享变量。为什么说是这是线程通信问题,就是A在写完这个volatile变量以后,实质上是A向接下来将要读这个变量的线程发出了其对该变量所作修改的信息,而B呢实
2021-04-27 10:14:51
157
原创 类加载的三个阶段
加载阶段: 通过类加载器,把class文件或者外部jar包定义为二进制文件加载进运行时数据区中,并且把类的元数据放在方法区(类的方法代码,变量名,方法名,访问权限,返回值等等),然后在堆中生成一个java.lang.class对象作为方法区数据的外部接口。 连接阶段: (1)验证: 确保class文件的字节流符合虚拟机的要求,四个检验动作:文件格式验证,元数据验证,字节码验证,符号引用验证。 (2)准备: 为类中static和final定义的变量在方法区分配内存并且设置初始值(0或者null)。 (3)解析
2021-03-25 09:09:50
177
2
原创 synchronize的实现原理和锁升级
synchronize存在着无锁、偏向锁、轻量级锁和重量级锁四种状态,会随着竞争的激烈逐渐升级。 偏向锁: 顾名思义,就是偏向第一个获得该对象的锁的线程,当线程请求到锁对象后,将锁对象的状态标志位改为01,即偏向模式。然后使用CAS操作将线程的ID记录在锁对象的Mark Word中。以后该线程可以直接进入同步块,进去以后标志计数加一。但是,一旦有第二条线程需要竞争锁,那么偏向模式立即结束,进入轻量级锁的状态。 轻量级锁: 升级为轻量级锁以后,线程进入同步块的时候,就会在线程的栈帧创建一个Lock Recor
2021-03-25 09:07:57
237
1
原创 Reentranlock的原理
Reentranlock的核心是AQS,分别有两个最终内部类NonfairSync和FairSync,都继承于AQS。 先来说说非公平锁吧,aqs的内部含有四个变量,分别是state、exclusiveOwnerThread、tail和head,线程在执行lock的时候,首先会尝试通过cas的方式去置state的值为1和把自己的线程ID给ownerThread,如果设置成功,就表明获得锁成功。如果失败,就表示之前的时候state的值已经大于等于1了,即已经被别的线程占用,这时候就会调用acquire()方法
2021-03-25 09:06:40
266
原创 ArrayList的实现原理
Arraylist内部有着几个变量,object类型的空数组elementdata,一个int类型值为10的default_capacity,然后还有两个空数组分别是empty_elementdata和defaultCapacity_empty_elementdata以及一个记录数组大小的size。 首先从构造方法说起,它有三种构造方法,第一个是默认构造方法,就是直接把defaultCapacity_empty_elementdata这个空数组赋值给elementdata。 第二种是自定义容量的构造方法,你
2021-03-25 09:05:16
178
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人