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;
    }
}NoVisibility可能会一直保持循环,因为对于读线程来说,ready的值可能永远不可见。甚至更奇怪的现象是,NoVisibility可能会打印0,因为早在对number赋值之前,主线程就已经写入ready并使之对读取线程可见,这是一种“重排序(reordering)”现象!
-------------------------------------------------------------------------------
以上是书“3.1 可见性”的一个例子,我想不明白的是,结果怎么会是“0”??
难道书中指的“重排序(reordering)”是将以下2句代码对调?请大侠赐教啊?想不明白。
        number = 42;
        ready = true;

解决方案 »

  1.   

    只有当ready是真的时候才会输出number 的内容,不可能是0!!!
      

  2.   

    我也运行过了啊,那难道是书上错了?《java并发编程实践》第3.1节 可见性。。
    感觉评论还不错的,想买本看的,现在有点犹豫了。谁还有其他java并发类的书推荐吗??
      

  3.   

    关于这个问题,书上讲的是对的,至于为什么,看java的书是没用的,要看cpu体系结构的书。
      

  4.   

    那本书的口碑还是不错的。如果你需要的是入门级的,那么可以看看《java多线程设计模式详解》,日本人写的,通俗易懂,适合上手。
      

  5.   

    ready与number是静态变量,在转入堆时有默认的值吧:ready=false,number=0;
      

  6.   

    哎、、CUP的还是算了。我暂时先这样理解了。谢谢各位啦!!