首页   快速返回

并发机制的底层实现原理摘要     所属分类 java
java并发编程的艺术 第二章读书笔记

synchronized volatile

volatile

可见性 
volatile变量写操作,jvm向处理器发送一条Lock前缀的指令,将该变量所在缓存行的数据写回系统内存,
同时根据处理器的缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己的数据是否过期,过期则设置无效重新加载。 

禁止指令重排


synchronized
同步方法,当前实例对象作为锁
静态同步方法,当前类的Class对象作为锁
同步方法块 


每个对象 关联 一个 monitor 
monitorenter  monitorexit


偏向锁
等到竞争出现才释放锁 

在锁对象的对象头和栈帧的锁记录里存储锁偏向的线程ID 
如果检测没有偏向锁,检测Mark Word中的锁标识是否设置为1,如果没有设置就是用CAS竞争锁 
如果设置为1,尝试用CAS将对象的偏向锁指向当前线程

MarkWord


轻量级锁
加锁
在当前线程的栈帧中创建用于存储锁记录的空间,将对象头中的Mark Word复制到锁记录中,
然后尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针,失败则与其他线程竞争,尝试自旋获得锁。

解锁
CAS将栈帧中存储的Mark Word替换回对象中,失败就代表存在竞争,膨胀为重量级锁


无锁 偏向锁 轻量级锁 重量级锁

CAS 设置id
CAS 自旋
MUTEX 操作系统互斥



原子操作实现原理

处理器
基于缓存加锁或基于总线加锁 

总线加锁   处理器LOCK 信号,当一个处理器在总线上输出此信号时,其他处理器的请求被阻塞,该处理器独占总线。 
缓存加锁   使用缓存一致性原则


Java 使用锁或 CAS 


CAS 的 三大问题

ABA问题 
循环时间长开销大 
只能保证一个共享变量的原子操作

上一篇     下一篇
springboot序列化异常FAIL_ON_EMPTY_BEANS处理

springboot应用打成war包

并发编程的挑战摘要

java7 hashmap 要点

常用hash算法及冲突解决方法

java8 hashmap 要点