gpt4 book ai didi

java - java并发编程中的可见性问题

转载 作者:行者123 更新时间:2023-11-30 08:49:03 26 4
gpt4 key购买 nike

我在“Java 并发实践”一书中遇到了以下示例。

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 could loop forever because the value of ready might never become visible to the reader thread. Even more strangely, NoVisibility could print zero because the write to ready might be made visible to the reader thread before the write to number, a phenomenon known as reordering.

我能理解重新排序问题,但我无法理解可见性问题。为什么 ready 的值可能永远不会对读者线程可见?一旦主线程将值写入ready,迟早读者线程将有机会运行并读取ready的值。为什么主线程在 ready 中所做的更改可能对读者线程不可见?

最佳答案

ReaderThreadrun() 方法可能永远看不到 ready 的最新值,因为它可以自由假设和优化该值不要在它的线程之外改变。这种假设可以通过使用语言的相关并发特性来消除,例如将关键字 volatile 添加到 ready 的声明中。

关于java - java并发编程中的可见性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31633699/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com