RedSpider1 / concurrent

这是RedSpider社区成员原创与维护的Java多线程系列文章。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于第八章中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 节。