java - 关于 "Java Concurrency in Practice"示例的问题

标签 java concurrency

我正在查看 Brian Goetz 的“Java Concurrency in Practice”中的代码示例。他说这段代码可能会停留在无限循环中,因为“'ready' 的值可能永远不会对读者线程可见”。我不明白这是怎么发生的……

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

最佳答案

因为 ready 没有被标记为 volatile 并且该值可能会在 while 循环的开头被缓存,因为它不是在 while 循环中更改。这是抖动优化代码的方式之一。

因此,线程可能在 ready = true 之前启动并读取 ready = false 在本地缓存该线程并且不再读取它。

查看 the volatile keyword .

关于java - 关于 "Java Concurrency in Practice"示例的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1919469/

相关文章:

JAXB 中的 java.awt.Point 和 java.awt.Rectangle

java - 使用节点的双链表

c# - 偷看后从并发队列中删除元素的模式

java - 如何同时启动两个进程然后等待两个进程完成?

c++ - 如果我们使用内存防护来增强一致性,那么 “thread-thrashing”会如何发生?

java 并发实践 5.19

java - 如何使用多线程按顺序将对象 block 持久保存在数据库中?

java - EIP中消息路由器和基于内容的路由器的区别

java - 为我的游戏添加生命

java - Java 中的锁定效果