- Java code
public class ThreadTest { private static boolean ready; private static int number; private static class ReaderThread extends Thread { /* (non-Javadoc) * @see java.lang.Thread#run() */ public void run() { while(!ready) { Thread.yield(); System.out.println(number); } } } /** * @param args */ public static void main(String[] args) { new ReaderThread().start(); number = 42; ready = false; }}
ReaderThread可能会一直保持循环,因为对于ReaderThread来说,ready的值可能永远不可见。
为什么对于ReaderThread来说ready的值不可见?
------解决方案--------------------
这根java的内存模型有关系。这样:
private volatile static boolean ready;
volatile可以保证可见性。
------解决方案--------------------
ready和number两个变量,你在ReaderThread 中使用的时候用的是这两个变量的拷贝,在main Thread中也是一个拷贝,并不是直接操作这两个变量,所以会出现你在main thread中修改了这两个变量的值,但是ReaderThread却“看”不到main thread做的修改。这就是“可见性”。