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

作者:jingxian 时间:2023-10-20 03:11:34 

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


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,死循环,并发
0
投稿

猜你喜欢

  • 解决CollectionUtils.isNotEmpty()不存在的问题

    2021-11-15 12:03:17
  • 解决Springboot启动报错:类文件具有错误的版本61.0,应为 52.0

    2023-03-13 02:16:11
  • Android实现上下菜单双向滑动

    2023-06-10 02:43:37
  • Android viewpager 3D画廊的实现方法

    2021-05-28 21:19:27
  • 详解AndroidStudio3.0开发调试安卓NDK的C++代码

    2022-09-29 07:02:53
  • C#设计模式之Mediator中介者模式解决程序员的七夕缘分问题示例

    2021-10-05 16:28:14
  • spring MVC中接口参数解析的过程详解

    2023-11-28 09:17:50
  • C#在子线程中更新窗口部件的写法

    2022-04-01 09:57:50
  • 带你入门Java的泛型

    2023-06-08 02:48:24
  • Android开发之实现GridView支付宝九宫格

    2023-01-26 15:26:16
  • 使用SpringBoot开发Restful服务实现增删改查功能

    2023-01-20 05:17:29
  • SpringBoot JS-SDK自定义微信分享的实现

    2023-11-10 05:08:28
  • C# 获取IP及判断IP是否在区间

    2021-10-06 23:44:50
  • C#生成验证码图片的方法

    2023-07-18 19:39:15
  • Android编程实现自动检测版本及自动升级的方法

    2023-06-07 16:24:23
  • 设计模式在Spring框架中的应用汇总

    2023-10-22 19:20:09
  • Struts 2中实现Ajax的三种方式

    2022-04-30 05:46:28
  • C#数组初始化简析

    2022-01-02 11:55:12
  • c语言switch反汇编的实现

    2023-06-29 03:38:17
  • 简单了解java标识符的作用和命名规则

    2022-06-18 17:49:09
  • asp之家 软件编程 m.aspxhome.com