当前位置: 首页 > article >正文

java乱序执行实验

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

实验代码如下:

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,控制台打印结果如下:

x == 0 && y == 0
x == 0 && y == 0
x == 0 && y == 0
x == 0 && y == 0

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

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

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

        变为了

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

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


http://www.kler.cn/a/440989.html

相关文章:

  • Java——网络编程(下)
  • IOS学习路线图
  • 【数据库系列】PostgreSQL 数据库连接
  • 【Unity踩坑】Unity生成iOS的XCode项目时提示错误:xcrun: error: SDK “iphoneos“ cannot be located
  • NX系列-使用 `nmcli` 命令创建 Wi-Fi 热点并设置固定 IP 地址
  • Qt 使用modbus协议
  • MySQL通过binlog日志进行数据恢复
  • 国标GB28181-2022平台EasyGBS:双网口的网络硬盘录像机怎么设置IP地址以及录像机怎么添加不同网段的摄像机?
  • docker 搭建在线聊天应用
  • QT实战经验总结 连载中
  • 乐优购物商城设计与实现
  • 华为ensp--BGP自动路由聚合
  • STM32 HAL库 + LM2904运算放大器 + ADC + 4-20ma液位传感器:电路设计及代码实现
  • 【功能安全】硬件集成和验证
  • 深入网络安全:从理论到实践的探索
  • 【PPTist】画布状态管理
  • Flink CDC 读取oracle库数据性能优化
  • Qt之修改窗口标题、图标以及自定义标题栏(九)
  • 【Leetcode 每日一题】3291. 形成目标字符串需要的最少字符串数 I
  • 建站经验:服务器同步与数据库备份的终极解决方案