volatile关键词的原理与用途

本文的思想来源于:
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.

你可能感兴趣的:(jvm,thread,多线程,cache,F#)