学习自https://www.bilibili.com/video/BV16J411h7Rd?p=247&spm_id_from=pageDriver
主要截取里边的文字和图片,略加个人描述
volatile原理
-
volatile的底层实现原理是内存屏障,Memory Barrier (Memory Fence)
-
对volatile变量的写指令后会加入写屏障
在该屏障之前,共享变量的任何改动都会更新到主存中
-
对volatile变量的读指令前会加入读屏障
在该屏障之后,共享变量的读取,加载的是主存中的最新数据
-
双层检查锁
优点:运行快
缺点:synchronized不能保证外边的代码原子性 同步性等,还没调用构造方法就被其他线程拿去用了
所以需要给INSTANCE 添加一个 volatile
CAS
cas中共享变量是用volatile修饰,保证该其他线程能看到最新值,但1`不能解决指令交错的问题
cas效率比synchronized高
- 有锁情况下,没获得锁则会会发生上下文切换,代价比较高
- 无锁情况下,因为线程要保持运行,需要额外cpu支持,当没有分到时间片时候,也会导致上下文 切换
非公平锁实现
-
加锁成功的情况
- 利用CAS修改state为1
-
加锁失败的情况
-
释放锁的过程
- 释放成功
-
释放失败
-
如果是非公平锁,会cas获得状态,如果状态为0,直接抢锁
-
如果是公平锁,不会直接被抢,会检查一下AQS队列里有没有老二(前驱节点),让他先获得锁
可重入原理
可打断原理
-
不可打断模式下,即使被打断了,也仍停留在AQS队列中,继续运行,只是打断标记被设置为true,没什么影响
-
打断模式下
条件变量实现原理
await流程
-
每个条件变量对应着一个等待队列(ConditionObject),单向链表
-
然后full release 释放锁