如何知名度的问题发生在Java并发? [重复](How do visibility proble

2019-09-26 11:09发布

这个问题已经在这里有一个答案:

  • 关于“Java并发实践”的例子问题 6个回答

我读的书:“Java并发实践”,以便更好地理解Java并发如何工作的。 在第3章第3.1节:可见有和的例子,其中本书试图展示如何发生的知名度的问题。 下面是示例代码(清单书中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;
    }
}

书中说,NoVisibility可能永远循环下去,因为准备的价值可能永远不会成为读者线程可见。 这怎么可能。 我一般的理解是,准备将在一定的时间内成为真正的反正。 但我不明白为什么这可能不会发生,循环将会永存。 有人可以帮助我更好地理解这种。

Answer 1:

由于准备不标记为挥发性和值可能在while循环的开始被缓存,因为它不是while循环内改变。 它的抖动优化代码的方法之一。

因此,这可能是线程之前准备好=真正的开始,并读取准备=假缓存是线程本地永不再读取它。

退房volatile关键字。

资源



文章来源: How do visibility problems occur in Java concurrency? [duplicate]