java乱序执行实验

为了对Java代码进行优化,提高执行效率,JVM和编译器对代码进行了优化,有些代码可能会乱序执行。

实验代码如下:

java 复制代码
for (int i = 0; i < Integer.MAX_VALUE; i++) {

    a = 0;
    b = 0;
    x = 0;
    y = 0;

    Thread t1 = new Thread(() -> {
        a = 1;
        x = b;
    }, "t1");

    Thread t2 = new Thread(() -> {
        b = 1;
        y = a;
    }, "t2");

    t1.start();
    t2.start();

    t1.join();
    t2.join();

    if (x == 0 && y == 0) {
        System.out.println("x == 0 && y == 0");
    }
}

如果是顺序执行的话,

情况1:

当执行到x=b时,还未执行b=1,那么b=0,x=0,此时a=1已经执行过了,最后y=1

情况2:

当执行到x=b时,已经执行b=1,那么b=1,x=1,此时a=1已经执行过了,最后y=1

所以x=0或x=1时,y=1

同理y=0或y=1时,x=1

那么不可能出现x与y同时为0的情况

但是实验结果证明代码是乱序执行的,测试15s,控制台打印结果如下:

java 复制代码
x == 0 && y == 0
x == 0 && y == 0
x == 0 && y == 0
x == 0 && y == 0

可以看出15s内出现了4次乱序执行,之所以出现这种情况,就是代码从

java 复制代码
Thread t1 = new Thread(() -> {
	a = 1;
	x = b;
}, "t1");

Thread t2 = new Thread(() -> {
	b = 1;
	y = a;
}, "t2");

变为了

java 复制代码
Thread t1 = new Thread(() -> {
	x = b;
	a = 1;
}, "t1");

Thread t2 = new Thread(() -> {
	y = a;
	b = 1;
}, "t2");
相关推荐
云南新人和数采集团19 小时前
DeepSeek Harness 开源贡献手记:从入门到合入主线
python·开源·github
知守观19 小时前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
深盾科技_Virbox19 小时前
换机或重装后软件许可怎么恢复:先核对哪四项
java·服务器·数据库
Zhuo1Joy19 小时前
中间件挂了怎么办:兜底的边界与取舍
java
用户0723670666019 小时前
基于 JavaAgent 的无侵入 Mock:让联调和链路测试不再等下游
java·后端
小蒜学长19 小时前
基于SpingBoot+Vue的定向越野赛事管理系统的设计与开发(代码+数据库+LW)
java·前端·spring boot·后端·前后端分离·定向越野赛事
海岳云舟19 小时前
spring自带线程池使用不当导致的死锁问题
java·后端
yuzhiboyouye19 小时前
Optional和Stream经典丰富的用法demo,以及相关的详细介绍
java
SuperHeroWu719 小时前
ArkGenie 的技术原理:从一段 SSE 到一个可交互 Surface
开发语言·php·交互
小蒜学长20 小时前
基于过程性评价的ai助学平台(代码+数据库+LW)
java·spring boot·后端·微信小程序·过程性评价