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");
相关推荐
北京_宏哥7 分钟前
🔥PC端自动化测试实战教程-4-pywinauto 操作PC端应用程序窗口 - 上篇(详细教程)
前端·python·测试
努力学习的小廉8 分钟前
【C++】 —— 笔试刷题day_14
开发语言·c++
北京_宏哥9 分钟前
🔥PC端自动化测试实战教程-3-pywinauto 启动PC端应用程序 - 下篇(详细教程)
前端·windows·python
浪淘沙jkp10 分钟前
智慧水务项目(八)基于Django 5.1 版本PyScada详细安装实战
后端·python·django·pyscada
wenbin_java12 分钟前
设计模式之备忘录模式:对象状态的可逆时光机
java·设计模式·备忘录模式
fengwuJ19 分钟前
Idea忽略已提交文件
java·ide·git·intellij-idea·ignore
漫步企鹅23 分钟前
【GDB】调试程序的基本命令和用法(Qt程序为例)
开发语言·qt·gdb·调试
互联网搬砖老肖25 分钟前
21 天 Python 计划:MySQL索引机制从基础到应用
python·mysql·adb
阿昆的科研日常33 分钟前
Matlab个性化绘图第10期—滑珠进度柱状图
开发语言·matlab·可视化·论文插图
斑驳的岁月33 分钟前
MacOs java环境配置+maven环境配置踩坑实录
java·macos·maven