加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

在Java 8中是否存在并发中发生的活动失败

发布时间:2020-12-15 04:21:10 所属栏目:Java 来源:网络整理
导读:我将尝试重现以下有效 Java(第二版)中提到的代码. 属于第10章并发项66. public class StopThread { private static boolean stopRequested; public static void main(String args[]) { Thread backgroudThread = new Thread(new Runnable(){ public void run
我将尝试重现以下有效 Java(第二版)中提到的代码.
属于第10章并发项66.

public class StopThread {
   private static boolean stopRequested;

   public static void main(String args[]) {
      Thread backgroudThread = new Thread(new Runnable(){
             public void run() {
                int i = 0;
                while(!stopRequested) {
                       i ++;
                }
             }
      });
      backgroudThread.start();

      TimeUnit.SECONDS.sleep(1);
      stopRequested = true;
   }
}

根据作者的描述,当您运行上面的过程段时,backgroupdThread将不会终止.但是我无法在设置Java8环境的机器中重现它.那么这个问题是否已在Java最新版本中进行了优化?

更新
我在linux操作系统(redhat)中再试一次.它总是不会终止.之前我在Win7操作系统COREi5中运行它.它总是终止.

PS:在linux操作系统(redhat).如果按上述代码运行,程序将不会终止.但是如果我在“while”循环中的“i”之后添加“System.out.println(i)”.此时.程序将始终终止.这是我的新发现.如果您知道原因,请发布您的答案.我将继续深入研究这些系列问题,直到找到真正的原因.

解决方法

那么,如果更准确,作者写道:

On my machine,however,the program never terminates: the background
thread loops forever!

现在你仍然可以争辩这个原因他显然没有“永远”运行这个程序,但你明白了.

顺便说一句,在我的机器上,程序永远不会终止(JDK 1.7.0_45)
顺便说一句2:如果我们希望它终止,我们所要做的就是将stopRequested声明为volatile

更新:
为了给没有这本书的人提供更多的上下文(你真的应该得到它!),作者后来解释说,这可能发生的原因是编译器检测到stopRequested没有在本地更改,因此允许以下优化:

while(!stopRequested) {
      i ++;
}

变为:

if (!stopRequested)
    while(true) {
          i ++;
    }

JVM热点执行这种优化(称为提升).如果你想深入研究为什么它是一个合法的优化,你应该做一些阅读:JLS §17.4.3 Programs and Program Order

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读