Java-volatile关键字禁用CPU缓存

10次阅读

共计 576 个字符,预计需要花费 2 分钟才能阅读完成。

可见性: 一个县城对共享变量的修改, 另一个线程能够立刻看到。

volatile 的意义时禁用 CPU 缓存

public class VolatileExample {
    int x = 0;
    volatile boolean v = false;

    public  void writer(){
        x = 42;
        v = true;
    }
    public  void reader(){if (v){System.out.println(x);
        }
    }

假设线程 A 执行 writer() 方法,按照 volatile 语义,会把变量“v=true”写入内存;假 设线程 B 执行 reader() 方法,同样按照 volatile 语义,线程 B 会从内存中读取变量 v,如果线程 B 看到“v == true”时,那么线程 B 看到的变量 x 是多少呢?

1.5 以前的版本会出现 x = 0 的情况因为变量 x 可能被 CPU 缓存而导致 可见性问题。这个问题在 1.5 版本已经被圆满解决了。x=42, 为什么呢?

如果线程 B 读到了“v=true”,那么线程 A 设置的“x=42”对线程 B 是可见的。也就是说,线程 B 能看到“x == 42”,有没有一种恍然大悟的感觉?这就是 1.5 版本对 volatile 语义的增强,这个增强意义重大,1.5 版本 的并发工具包(java.util.concurrent)就是靠 volatile 语义来搞定可见性的。


码字不易如果对你有帮助请给个关注

爱技术爱生活 QQ 群: 894109590

正文完
 0