在 java 中,据我所知,volatile 变量使线程直接读取/写入主 CPU(不在每个线程的缓存中),因此使其更改对其他线程可见。
我不知道的是:那么,为什么这项工作(volatile 的)可以防止编译器/CPU 对代码语句重新排序。
谢谢:)
最佳答案
这是一个很好的例子,说明了禁止重新排序旨在解决的问题(摘自 here):
class VolatileExample {
int x = 0;
volatile boolean v = false;
public void writer() {
x = 42;
v = true;
}
public void reader() {
if (v == true) {
//uses x - guaranteed to see 42.
}
}
}
在此示例中,v
是可变的,但 x
不是。如果 writer 和 reader 并发执行并且 reader 看到 v
设置为 true
,则 x
保证为 42
.在 Java-5 之前,编译器可以自由地重新排序对 x
和 v
的写入,因此您可以看到 x
为零 after 你看到 v
设置为 true
。这令人困惑,并导致微妙的错误。 Java-5 内存模型通过使 volatile 写入几乎等同于同步来解决这个问题。
关于java - Volatile:为什么要阻止编译器重新排序代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9187527/