在约书亚·布洛赫(Joshua Bloch)的《有效的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
启动运行时,但未成功。是否有任何原因导致其无法正常工作(编辑:即不会永远循环)?约书亚在使用另一个运行时吗?我有一个四核常春藤桥。 最佳答案
stopRequested
不是volatile
。因此,不能保证backgroundThread
可以看到主线程对其所做的更改。可以看到更改,而可能看不到更改。没有保证。所以(一如既往),约书亚是正确的:)