在约书亚·布洛赫(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可以看到主线程对其所做的更改。可以看到更改,而可能看不到更改。没有保证。所以(一如既往),约书亚是正确的:)

10-05 22:52