Java 并发实践清单 3.1

Java concurrency in practice Listing 3.1

我正在阅读 Java 到目前为止非常有趣的并发实践

我遇到过清单 3.1 以及以下代码示例:

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;
}
}

我明白这个代码片段在理论上可能会出错。

我决定亲自去检查一下,所以我将代码输入了 IDE 和 运行 它大约 40 次,每次输出都是相同的:42.

所以我很好奇,我应该尝试多少次(统计上)并且 运行 它直到我看到一个失败的例子,为什么失败如此罕见? 我已经尝试搜索 SO 但我发现的是:question about “Java Concurrency in Practice” example 但它 不相关 我的问题因为我 do 理解它是如何可能会发生,但只是好奇为什么执行失败如此困难

谢谢:)

重新排序可以在 JIT 级别或 CPU 级别完成。您的代码太短,JIT 无法启动,因此它必须是 CPU.

对于如此简单的操作,CPU 确实没有理由开始搞乱您的代码,因此您可能永远不会观察到重新排序,您的程序将始终打印 42。

这个例子的重点并不是说它崩溃,而是理论上可以 休息。

另请参阅:Why this broken program always runs?