指令乱序,指令重排序
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
|
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个结果:
- 第一个线程执行到a=1的时候,第二个线程执行到了b=1,最后x=1,y=1;
- 第一个线程执行完,第二个线程才刚开始,最后x=0,y=1;
- 第二个线程执行完,第一个线程才开始,最后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