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并发》(这个例子似乎取自这本书本身) 当读取和写入发生在不同的线程中时,无法保证读取线程会及时看到另一个线程写入的值,甚至根本无法保证,因为线程可能会缓存这些值。
为了确保跨线程内存写入的可见性,必须使用同步或将变量声明为volatileOP,要详细了解这一点,请研究“Java内存模型”。这本书不仅解释得很好,它的作者Brian Goetz也在IBM的Developerworks网站上写了关于这个主题的文章。内存在线程之间根据“先发生后执行”操作序列共享。使用你最喜欢的搜索引擎来挖掘这些术语。