如何测试活动失败?

时间:2015-05-27 06:42:26

标签: java concurrency

在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使用另一个运行时吗?我有一个四核常春藤桥。

1 个答案:

答案 0 :(得分:1)

stopRequested不是volatile。因此,无法保证backgroundThread可以看到主线程对其所做的更改。可以看到变化,可能看不到变化。没有保证。所以(一如既往),约书亚是对的:)