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]