【JMM】同步原语之volatile

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取 2000+ 道 Java 面试题

文章首发于: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) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » 【JMM】同步原语之volatile

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏