指令乱序,指令重排序

指令乱序,指令重排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* 指令乱序,指令重排序
* <p>
* 弟2948605次(0,1)
* 弟2948606次(0,1)
* 弟2948607次(0,1)
* 弟2948608次(0,0)
*
* @author zc
* @date 2021/1/15 10:04
*/
public class Demo1 {
private static int x = 0, y = 0;
private static int a = 0, b = 0;

public static void main(String[] args) throws InterruptedException {
for (int i = 0; ; i++) {
x = 0;
y = 0;
a = 0;
b = 0;
Thread thread1 = new Thread(() -> {
a = 1;
x = b;
});
Thread thread2 = new Thread(() -> {
b = 1;
y = a;
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
String result = "弟" + i + "次(" + x + "," + y + ")";
if (x == 0 && y == 0) {
System.out.println(result);
break;
} else {
System.out.println(result);
}
}
}
}

定义四个静态变量x,y,a,b,每次循环时让他们都等于0,接着用两个线程,

第一个线程执行a=1;x=b;

第二个线程执行b=1;y=a。

这段程序正常来看有3个结果:

  1. 第一个线程执行到a=1的时候,第二个线程执行到了b=1,最后x=1,y=1;
  2. 第一个线程执行完,第二个线程才刚开始,最后x=0,y=1;
  3. 第二个线程执行完,第一个线程才开始,最后x=1,y=0;

理论上无论怎么样都不可能x=0,y=0;但是当程序执行到几万次之后,竟然出现了00的结果:弟2948608次(0,0)

因为指令被重排序了,x=b先于a=1执行,y=a先于b=1执行。

参考链接:

https://blog.csdn.net/qq_41973594/article/details/110452849

https://blog.csdn.net/yjp198713/article/details/78839698


指令乱序,指令重排序
https://happyloves.cn/20210401/c121bd1e199e.html
作者
赵小胖
发布于
2021年4月1日
许可协议