在一本名为“实践中的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作为结果。
答案 0 :(得分:0)
关于多线程有很多谜团,你会试图弄清楚事情出错的原因。它更容易做正确的事情。据说我的基本理解是由场景后面的机器进行优化,防止线程看到另一个线程发布的最新值。如果你需要一个例子,只需发布一些睡眠线程,然后更改一个值,另一个稍后再读取。如果发生故障,假定的单个值将有两个不同的值。