在Joshua Bloch的Effective Java,第66项中,他通过未能在线程之间传递变量来举例说明生命失败。
// Broken! - How long would you expect this program to run?
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args) throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!stopRequested)
i++;
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
他在自己的机器上说这永远不会终止,并且有两个原因。我在我自己的机器上,在Oracle JDK 7u75(最新的7)上尝试了这个,它总是在一秒后终止。我还尝试使用-XX:+AggressiveOpts
启动运行时但没有成功。是否有任何理由不按预期工作(编辑:即不能永远循环)? Joshua使用另一个运行时吗?我有一个四核常春藤桥。
答案 0 :(得分:1)
stopRequested
不是volatile
。因此,无法保证backgroundThread
可以看到主线程对其所做的更改。可以看到变化,可能看不到变化。没有保证。所以(一如既往),约书亚是对的:)