我的 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/