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