深入理解Java虚拟机 12.3节笔记
什么是Java内存模型?
- 主内存+工作内存;
- 定义了一些操作协议,来规范对主内存、工作内存的访问;
- 定义了共享变量的访问规则,即如何将对象写入内存,从内存种取出
类比计算机内存模型
由于CPU与内存之间速度不匹配,所以引入了缓存,由此导致了缓存一致性问题,需要协议来约定如何对主内存、高速缓存读写
Java内存模型定义了8种操作来规范对主内存、工作内存进行访问的过程
八种操作如下
- lock,unlock对主内存变量进行加锁,解锁,只允许一个线程访问,synchronized的底层指令monitorenter即可看成是这类
- read--load--use 变量从主内存--工作内存--执行引擎的三个指令
- assign--store--write 变量从执行引擎--工作内存--主内存的三个指令
每个操作对于基本数据类型(除了double,long)是原子的
volatile变量的特殊规则
- 可见性
- 共享变量修改后直接刷回主内存
- 每次使用时重新从主内存读
- 禁止指令重排序优化
- 内存屏障,之后的指令不能被重排到屏障前面
先行发生原则
判断数据是否存在竞争、线程是否安全的主要依据,操作A先于操作B发生,则A产生的影响能为B可见
一些规则:
- 线程启动 先于 线程的每一个动作
- 线程动作 先于 终止
- 对象终结 先于 初始化
- unlock 先于 同一次锁的下一次的lock
- volatile变量的写 先于 读
- 传递性