youyichannel

志于道,据于德,依于仁,游于艺!

0%

Volatile全解读-04

JSR-133增强volatile的内存语义

JSR-133增强的语义:

对上图的解释:

  • 当第二个操作是volatile写时,不管第一个操作是什么,都不允许重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后。
  • 当第一个操作是volatile读时,不管第二个操作是什么,都不允许重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前。
  • 当第一个操作是volatile写、第二个操作是volatile读时,不能重排序。

在JSR-133之前的旧Java内存模型中,虽然不允许volatile变量之间的重排序,但是旧Java内存模型运行volatile变量与普通变量重排序,这样会产生问题。

【🌰栗子】

class VolatileExample {
int a = 0;
volatile boolean flag = false;
public void writer() {
a = 1; // 1
flag = true; // 2
}
public void reader() {
if(flag) { // 3
int i = a; // 4
}
}
}

在旧的内存模型中,当1和2之间没有数据依赖关系时,1和2之间就可能被重排序(3和4类似)。其结果就是:当线程B在执行4时,不一定能够看到写线程A执行1时的对共享变量的修改。

视频地址 强推 河北王校长