本文的思想来源于:
Jeremy Manson and
Brian Goetz, 《
JSR 133 (Java Memory Model) FAQ》, February 2004, http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization
volatile字段被用来在线程之间communicate state。任意线程所read的volatile字段的值都是最新的。
原因有四:
(1) 编译器和JVM会阻止将volatile字段的值放入处理器寄存器(register);
(2) 在write volatile字段之后,其值会被flush出处理器cache,写回memory;
(3) 在read volatile字段之前,会invalidate处理器cache。因此,上述两条便保证了每次read的值都
是从memory中的。
(4) 禁止reorder任意两个volatile字段或者volatile变量,并且同时严格限制(尽管没有禁止)reorder
volatile字段(或变量)周围的非volatile字段(或变量)。
由于第(4)条中对volatile字段以及周围非volatile字段(或变量)reorder的限制,如下程序中,假设线程A
正在执行reader方法,同时,线程B正在执行writer方法。线程B完成对volatile字段 v 的赋值后,相应的结
果被写回内存。如果此时线程 A 便得到的 v 的值正好为true,那么线程A也可以安全地引用 x 的值。然而,
需要注意的是,假如v不是volatile的,那么上述结果就不一定了,因为x和v赋值的顺序可能被reorder。
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.
}
}
}
关于上述解释的原文为:because the memory model places stricter constraints on reordering of
volatile field accesses with other field accesses, volatile or not, anything that was visible to
thread A when it writes to volatile field f becomes visible to thread B when it reads f.