在约书亚·布洛赫的“有效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启动运行时,但没有成功。有什么原因可以解释为什么它不能正常工作(编辑:也就是不会永远循环)?约书亚正在使用另一个运行时吗?我有一座四核常春藤桥。
发布于 2015-05-27 06:45:22
stopRequested不是volatile。因此,不能保证主线程对其所做的更改将由backgroundThread看到。可以看到变化,可能看不到变化。没有任何保证。所以(一如既往),约书亚是对的:
https://stackoverflow.com/questions/30474980
复制相似问题