Volatile
基本
- 保证线程之间的可见性(JMM原子操作)
- Volatile保证可见性与有序性,但是不保证原子性(需要借助synchronized这样的锁机制)
缓存可见性实现原理
- 底层实现主要是通过汇编lock前缀指令,它会锁定这块内存区域的缓存(缓存行锁定)并回写到主内存
- IA-32架构软甲开发者手册对lock指令的解释:
- 会将当前处理器缓存行的数据立即写回到系统内存
- 这个写回内存的操作会引起在其他cpu里缓存了该内存地址的数据无效(MESI)
- 在store之前lock,在write之后再unlock
MESI缓存一致性协议
- 一开始计算机使用总线加锁,即lock跟unlock,最后发现性能太低
- MESI:多个cpu从主内存读取到同一个数据到各自的高速缓存,当其中某个cpu修改了缓存里的数据,该数据会马上同步回主内存,其他cpu通过总线嗅探机制可以感知到数据的变化从而将自己缓存里的数据失效
- 总线:cpu传输数据到各个硬件的线(物理存在)
- volatile会开启MESI,cpu里的线程会监听总线,发现其他线程修改变量时,会让工作内存里的该变量失效,然后再去主内存取值