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?
我正在阅读 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?