码迷,mamicode.com
首页 > 其他好文 > 详细

volatile 内存语义

时间:2018-10-17 14:50:37      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:语义   内存屏障   volatil   一个   刷新   volatile   另一个   href   规则   

读内存语义:当读一个 volatile 变量时,JMM 将该线程对应的本地内存置为无效,从主内存中读取共享变量。

写内存语义:当写一个 volatile 变量时,JMM 将该线程对应的本地内存中的共享变量值刷新到主内存。

读写内存语义加起来,就能保证可见性:一个线程修改了 volatile 修饰的共享变量之后,另一个线程可以读到这个修改后的值。

内存语义怎么实现?需要 JMM 限制《重排序》。

限制规则如下图:

技术分享图片

volatile 读写之间禁止重排序是毋庸置疑的。

另外请看下图,为了保证 1 happen before 4,另外两项重排序也是需要禁止的。

技术分享图片

而限制重排序的手段就是插入内存屏障:

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

内存屏障的类型:

技术分享图片

volatile 内存语义

标签:语义   内存屏障   volatil   一个   刷新   volatile   另一个   href   规则   

原文地址:https://www.cnblogs.com/xmsx/p/9800615.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!