是对Java中的volatile的内存屏障写操作

我最近在一次演讲中听说,对volatile的写操作会为线程已写入的每个变量触发内存屏障。真的对吗?从JLS看来,似乎只有相关的变量被清除了,而其他变量则没有。有人知道什么是正确的吗?能否给我指出JLS中的具体位置?

回答:

对挥发性变量和其他变量的引用是正确的。我没有意识到,before-

before的可传递性是VM必须实现的,而不是从定义中得出的。我仍然感到困惑,为什么并没有明确说明具有如此深远影响的事物,而实际上却是某些定义的必然结果。总结一下:假设您有以下4种操作:

thread1        thread2

a1

a2

a3

a4

其中a2是对易失性变量v的写操作,而a3是对同一个易失性变量v的读操作。根据对事件的定义-(hb)分别是hb(a1,a2)和hb(a3,a4)。另外,对于挥发物,我们有hb(a2,a3)。现在从所需的hb传递性得出hb(a1,a3)。因此,易失性变量v的写入和后续读取将充当存储屏障。

以上是 是对Java中的volatile的内存屏障写操作 的全部内容, 来源链接: utcz.com/qa/408192.html

回到顶部