为了对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");