如何在Java中触发重新排序现象?

时间:2015-01-10 05:59:43

标签: java multithreading

在一本名为“实践中的Java并发”的书中,我在第3章的开头看到了这样的示例代码

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的值可能永远不会对readerthread可见。”

“NoVisibility可以打印为零,因为写入就绪可能会在写入数字之前对readerthread可见,这种现象称为重新排序。”

我想知道如何触发上述任何一个事件(即永远循环或打印零)。

有谁知道如何实现这一目标?

我已尝试在我的机器上执行此程序(Windows 8.1上的javaSE-1.7)多次。它总是打印42作为结果。

1 个答案:

答案 0 :(得分:0)

关于多线程有很多谜团,你会试图弄清楚事情出错的原因。它更容易做正确的事情。据说我的基本理解是由场景后面的机器进行优化,防止线程看到另一个线程发布的最新值。如果你需要一个例子,只需发布​​一些睡眠线程,然后更改一个值,另一个稍后再读取。如果发生故障,假定的单个值将有两个不同的值。