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");
相关推荐
Thneonl39 分钟前
Celery 生产踩坑:1000 任务积压与 acks_late 双重执行
后端·python
清桔39 分钟前
模型的调用
python
IT枫斗者枫哥39 分钟前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
代码方舟39 分钟前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
小小张说故事39 分钟前
Python 多线程为什么跑不快?asyncio 入门指南:异步并发从零上手
后端·python
BBmmo40 分钟前
我的 Java 学习笔记 · 第 7 篇:泛型与通配符
java
独泪了无痕40 分钟前
Hutool之RandomUtil:随机数生成的终极利器
java·后端
10年前端老司机40 分钟前
干货分享|企业智能知识库 Rerank 重排序落地实践与踩坑总结
python·aigc·agent
花开路口40 分钟前
深入理解 Java/Kotlin 协变与逆变
java·kotlin
运行时异常41 分钟前
【WMS 仓储系统集成 AI Agent 实战】第 7 讲:Vue3 前端工程化——Token 刷新锁、Markdown 渲染踩坑与权限体系
java