首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试活性失败?

如何测试活性失败?
EN

Stack Overflow用户
提问于 2015-05-27 06:42:26
回答 1查看 192关注 0票数 2

在约书亚·布洛赫的“有效Java”第66项中,他通过未能在线程之间传递变量来说明生命的失败。

代码语言:javascript
复制
// 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启动运行时,但没有成功。有什么原因可以解释为什么它不能正常工作(编辑:也就是不会永远循环)?约书亚正在使用另一个运行时吗?我有一座四核常春藤桥。

EN

回答 1

Stack Overflow用户

发布于 2015-05-27 06:45:22

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30474980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档