为了对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企服之家,中国第一个企服评测及商务社交产业平台。 |