标签:
Java中volatile修饰符是一种用来保证不同线程之间交互的特殊机制。当一个线程修改volatile变量,另一个线程能够看到这个修改。第一个线程通知第二个线程变量已经被修改。
下面用图来解释:
ready是一个volatile boolean变量, 初值设为false. answer是一个非volatile int变量,初值是0.
第一个线程准备好修改ready变量,它是两个线程交流的发送方。第二个线程读取ready变量,获取第一个线程修改的值,因此它是接收方。在两个线程交流时,在线程1修改ready变量前,内存中所有变量对线程1可见,在线程2准备好读取ready变量的值true后,内存中所有变量必须对线程2可见。
这就保证了如果线程要输出什么的值的话,那就是42.
如果ready不是volatile的,那会发生什么呢?在线程1和线程2之间将不会有任何明显的交流。
线程1修改ready(现在是non-volatile)后的值可能会传递给线程2,因此线程可能可以读取ready的值true. 然而,线程1也可能不会将修改后的ready的值传递给线程2,answer的值也不会传递给线程2,那么线程2将会输出0.
参考资料:
http://jeremymanson.blogspot.jp/2008/11/what-volatile-means-in-java.html
标签:
原文地址:http://www.cnblogs.com/KarenWang/p/4537172.html