请看下面的代码(摘自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/