欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-08 20:35:28
下面的代码将发生死循环: package com.zzj.concurrency; public class volatileobjecttest impl...

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

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并发之不可思议的死循环详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。