java - 尽管更新了值,线程仍陷入无限循环

标签 java

我的 friend 给了我一个问题,要求我解释为什么程序会陷入无限循环。

public class Test {
    private static boolean flag;
    private static int count;

    private static class ReaderThread extends Thread {
        public void run() {
            while (!flag)
                Thread.yield();
            System.out.println(count);
        }
    }

    public static void main(String[] args) {
        new ReaderThread().start();
        count = 1;
        flag = true;
    }
}

我确信这不会发生。但它确实发生过一次(大概有 50 次)。

我无法解释这种行为。有什么我遗漏的吗?

最佳答案

摘自书籍 - Java Concurrency In Practice(此示例似乎取自书籍本身)。

当读取和写入发生在不同的线程中时,无法保证读取线程会及时看到另一个线程写入的值,甚至根本看不到,因为线程可能会缓存这些值。 为了确保跨线程内存写入的可见性,您必须使用同步或将变量声明为volatile

关于java - 尽管更新了值,线程仍陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956176/

相关文章:

Java导入包错误

java - OSGI 是否解决了 Java 中缺少 AppDomain 的问题?

java - 谁在调用 paintComponent?

java - 使用 Spring 和 Hibernate 自动创建/更新表

java - 属性 DTO 中格式化日期的符号 Gson

java - 使用 JAXB 和 Any 序列化

java - 使用 Spring Integration 命令总线启动/停止通过注释定义的 AbstractEndpoints

java - 在 JDialog 上定位和调整 JScrollBar 的大小

Java RegEx - 检查字符串是否以精确的数字结尾

java - 为什么这个 Java RSA 解密不起作用?