这是一个很好的示例,说明了禁止重新排序的目的是要解决的问题(从此处获取):
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不是。如果作者和阅读者同时执行并且读者看到
v设置为
true,
x则保证为
42。在此之前的Java-5,编译器可以自由地重新排序的写入
x和
v,所以你可以看到
x在零点
以后 你见过
v设置为
true。这令人困惑,并导致细微的错误。Java-5内存模型通过使易失性写入几乎等同于同步来解决了此问题。



