关于第八章中volatile的使用
yan624 opened this issue · comments
在 8.2.1 节有一幅图,图里的第二步为什么把 a 的数据也刷新到主存里了。下面代码中,a 没有被标记为 volatile 啊。
public class VolatileExample {
int a = 0;
volatile boolean flag = false;
public void writer() {
a = 1; // step 1
flag = true; // step 2
}
public void reader() {
if (flag) { // step 3
System.out.println(a); // step 4
}
}
}
文中说到“当一个线程对volatile修饰的变量进行写操作(比如step 2)时,JMM会立即把该线程对应的本地内存中的共享变量的值刷新到主内存”。
这里的共享变量是说类中的所有成员变量吗?如果是的话,岂不是 volatile 关键字修饰任意一个成员变量就可以实现内存可见性?
下一节的内存屏障好像提到了,内存屏障会强制把缓存中的脏数据刷新到主内存。🤔
另外,8.2.2 节标错了,它显示还是 8.2.1 节。