请看下面的代码(摘自Effective Java书)

import java.util.concurrent.TimeUnit;


public class Main {
private static boolean stopReq;
public static void main(String[] args) throws InterruptedException {


    Thread bgw = new Thread(new Runnable()
    {
        public void run(){

        int i = 0;
        while(!stopReq){ i++;}
        }
        });
    bgw.start();
    TimeUnit.SECONDS.sleep(1);
    stopReq = true;

}

}

为什么bgw线程陷入无限循环?它到达循环时是否缓存它自己的stopReq副本?因此,它永远不会看到其他线程的更新值?

我知道解决此问题的方法是同步或使用volatile变量,但是我很好奇为什么当前的实现无法正常工作。

谢谢

最佳答案

您的解释是正确的。

编译器检测到stopReq从未在循环中被修改,并且由于它不是volatile,因此将while(!stopReq)指令优化为while(true)

即使该值以后更改,该线程甚至都不会再读取它。

关于java - 为什么Java无法从另一个线程看到更新的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21135870/

10-12 18:36