日期:2014-05-20  浏览次数:20723 次

关于线程的一个问题
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做的修改。这就是“可见性”。