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