【JMM】同步原语之volatile
引言
Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的可见性。
语义
- 保证了不同线程对这个变量进行操作时的可见性。
- 禁止进行指令重排序。
happens-before中的volatile
volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
禁止重排序
通过内存屏障来阻止指令重排序。
JMM内存屏障图:
volatile重排序规则表(”NO”表示禁止重排序。):
策略:
- 在每个volatile写操作的前面插入一个StoreStore屏障;
- 在每个volatile写操作的后面插入一个StoreLoad屏障;
- 在每个volatile读操作的后面插入一个LoadLoad屏障;
- 在每个volatile读操作的后面插入一个LoadStore屏障。
盗用两张图片来加深理解,来自《java并发编程的艺术》:
参考:
聊聊并发(一)深入分析Volatile的实现原理
内存屏障和 volatile 语义
正确使用 Volatile 变量
彻底理解volatile
Java并发编程:volatile关键字解析
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!