前段时间我在看Effective Java的时候,第10章-并发中有这样一个讲解:
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args) throws Exception {
Thread backgroundThread = new Thread(new Runnable(){
public void run() {
int i = 0;
while(!stopRequested) {
i++;
}
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
书上说:“你可能期待这个程序运行大约一秒左右,之后主线程将stopRequested设置为true,使后台线程的循环终止。但是在我的机器上,这个程序永远不会终止:因为后台线程永远在循环!问题在于,由于没有同步,就不能保证后台线程何时‘看到’主线程对stopRequested得值所做的改变。没有同步,虚拟机将这个代码:
while(!done)
i++;
转变成这样:
if(!done)
while(true)
i++;
”
这到底是什么意思呢?为什么没有使用同步则后台线程看不到stopRequested的变化呢?
最主要的问题在于,这段代码在我的机器上跑,貌似1秒就结束了。
没有出现书中说描述的情况。书上这么写的原因是什么呢?为什么写成书上的样子就可以防止可见性问题的出现?
希望各位大神帮忙看下,给小弟我讲解讲解。小弟我是个技术小白。
DIEA
阿晨1998
繁星coding
相关分类