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");
相关推荐
程序员老陆14 小时前
嵌入式 Qt:QWidgets 还是 QML / Qt Quick?
开发语言·qt
.道阻且长.14 小时前
C++11 :新的类功能,lambda,包装器
开发语言·c++·后端
言乐614 小时前
JavaScript概括前端原理
开发语言·前端·javascript·python·ecmascript
liulilittle14 小时前
短期内不存在通用 AI 工作流魔法
大数据·开发语言·c++·人工智能·llm·agent·tools
郝学胜-神的一滴14 小时前
C++ Templates 03:手写一个Stack看透模板核心机制
开发语言·c++·产品运营·软件工程·产品经理
用户0190275816115 小时前
如何用 Python 回测肯特纳通道(Keltner Channel)突破策略?(EMA+ATR 通道)
python
(Charon)15 小时前
【C/C++面试】手写内存池:从空闲链表到内存申请与释放
java·开发语言·windows
EatFan15 小时前
Spring Boot 4 迁移避坑清单:Jackson 3、starter 拆分与最低 JDK 口径核对(含若依/芋道/CRMEB 升级对照)
java·数据库·spring boot·spring boot 4·java 21·jakarta ee 11·jackson 3
栖凤15 小时前
多 Agent 工作流实践:从单打独斗到协同作战
java·linux·服务器
派小心.15 小时前
页面关闭前埋点丢失:sendBeacon验收
开发语言·php