2019-10-29 09:18  阅读(2296)
文章分类:JMM

文章首发于:clawhub.club


Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。线程对volatile变量的修改会立刻被其他线程所感知,即不会出现数据脏读的现象,从而保证数据的可见性。

语义

  • 保证了不同线程对这个变量进行操作时的可见性。
  • 禁止进行指令重排序。

happens-before中的volatile

volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。

禁止重排序

通过内存屏障来阻止指令重排序。
JMM内存屏障图:

2019102910011\_1.png

内存屏障.jpg

volatile重排序规则表("NO"表示禁止重排序。):

2019102910011\_2.png

volatile重排序规则表.jpg

策略:

  • 在每个volatile写操作的前面插入一个StoreStore屏障;
  • 在每个volatile写操作的后面插入一个StoreLoad屏障;
  • 在每个volatile读操作的后面插入一个LoadLoad屏障;
  • 在每个volatile读操作的后面插入一个LoadStore屏障。

盗用两张图片来加深理解,来自《java并发编程的艺术》:

2019102910011\_3.png

volatile写.jpg

2019102910011\_4.png

volatile读.jpg

参考:

聊聊并发(一)深入分析Volatile的实现原理
内存屏障和 volatile 语义
正确使用 Volatile 变量
彻底理解volatile
Java并发编程:volatile关键字解析


来源:https://www.jianshu.com/p/347ea7f881f8

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 【JMM】同步原语之volatile
上一篇
【JMM】同步原语之Synchronized-简单介绍
下一篇
【JMM】-同步原语之final重排序规则