当前位置: 移动技术网 > IT编程>开发语言>Java > Java并发之不可思议的死循环详解

Java并发之不可思议的死循环详解

2019年07月22日  | 移动技术网IT编程  | 我要评论

下面的代码将发生死循环:

package com.zzj.concurrency;

public class volatileobjecttest implements runnable{
 private objecta objecta; // 加上volatile 就可以正常结束while循环了
  public volatileobjecttest(objecta a) { 
    this.objecta = a; 
  } 
  
  public objecta geta() { 
    return objecta; 
  } 
  
  public void seta(objecta a) { 
    this.objecta = a; 
  } 
  
  @override 
  public void run() { 
    long i = 0; 
    while (objecta.isflag()) { 
      i++; 
    } 
    system.out.println("stop my thread " + i); 
  } 
  
  public void stop() { 
    objecta.setflag(false); 
  } 
  
  public static void main(string[] args) throws interruptedexception { 
     // 如果启动的时候加上-server 参数则会 输出 java hotspot(tm) server vm 
    system.out.println(system.getproperty("java.vm.name")); 
      
    volatileobjecttest test = new volatileobjecttest(new objecta()); 
    new thread(test).start(); 
  
    thread.sleep(1000); 
    test.stop(); 
    system.out.println("main thread " + test.geta().isflag()); 
  } 
  
  static class objecta { 
    private boolean flag = true; 
  
    public boolean isflag() { 
      return flag; 
    } 
  
    public void setflag(boolean flag) { 
      this.flag = flag; 
    } 
  
  } 
}

死循环发生在代码段:

while (objecta.isflag()) { 
    i++;
}

这是由于编译器对其进行了优化,因为while循环内部没有修改objecta变量且没有用volatile修饰,jvm会把判断提前,类似于优化成如下:

if(objecta.isflag()){
  while(true){
    i++;
  }
}

以上这篇java并发之不可思议的死循环详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网