Java 尽管更新了值,线程仍卡在无限循环中

Java 尽管更新了值,线程仍卡在无限循环中,java,Java,我的朋友问了我一个问题,问我为什么程序会挂在无限循环中 public class Test { private static boolean flag; private static int count; private static class ReaderThread extends Thread { public void run() { while (!flag) Thread.yield(

我的朋友问了我一个问题,问我为什么程序会挂在无限循环中

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并发》(这个例子似乎取自这本书本身)

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

OP,要详细了解这一点,请研究“Java内存模型”。这本书不仅解释得很好,它的作者Brian Goetz也在IBM的Developerworks网站上写了关于这个主题的文章。内存在线程之间根据“先发生后执行”操作序列共享。使用你最喜欢的搜索引擎来挖掘这些术语。