共计 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
正文完