java线程可见性

时间:2012-03-26 07:29:00

标签: java concurrency

当我读到“实践中的java并发”c03时,我对以下程序感到困惑:

public class NoVisibility { 
    private static boolean ready; 
    private static int number; 

    private static class ReaderThread extends Thread { 
        public void run() { 
            while (!ready) 
                Thread.yield(); 
            System.out.println(number); 
        } 
    } 

    public static void main(String[] args) { 
        new ReaderThread().start(); 
        number = 42; 
        ready = true; 
    } 
}

由于重新排序和线程可见性,循环可能永远不会停止,或者输出可能为零,但我已尝试多次,输出始终为42。 所有的原因是我太幸运了?

1 个答案:

答案 0 :(得分:9)

  

所有原因都是我太幸运了?

不一定。它还取决于您的处理器架构和JVM实现。这是微妙的记忆模型问题的一个问题:它们很难在野外繁殖。