南飓风 发表于 2024-12-18 17:55:41

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");

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: java乱序执行实验