首页 > 开发 > Java > 正文

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

2024-07-13 10:03:08
字体:
来源:转载
供稿:网友

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

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


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表