Java 并发实践 list 3.1

标签 java multithreading concurrency

我正在阅读《Java 并发实践》,到目前为止,它非常有趣

我遇到过 list 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。

所以我很好奇,我应该尝试运行多少次(统计上)直到看到失败的示例,为什么失败如此罕见? 我尝试过搜索,但我发现的是:question about “Java Concurrency in Practice” example但这与我的问题无关,因为我确实了解它是如何发生的,但只是好奇为什么执行失败如此困难

谢谢:)

最佳答案

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

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

该示例的要点并不是说它将会损坏,而是理论上可能损坏。

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

关于Java 并发实践 list 3.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28003965/

相关文章:

java - 预期的空指针导致意外的 InvokingTargetException

java - 无法编辑 JAR 中的 java 类

java - 从 Mono.first 发出第一个成功结果

java - org.hibernate.PropertyNotFoundException

multithreading - 在unity3d中创建后台线程

multithreading - 为 Core Data 创建一个仅在一个线程上的 Grand Central Dispatch 队列

java - 如何在java中同步异步操作

java - socket.accept() 不执行

java - Room 数据库、RecyclerView 和并发问题

java - 非阻塞和阻塞并发