我们都知道语句之间可能存在指令重排,那么我们怎么知道语句发生了重排了,as - if-serial 就像是串行
重排的两个条件:
1、两条语句前后之间不依赖
2、重排之后的执行结果和单线程一样
看代码验证发生了指令重排
两个线程在正常情况下,怎么运行都不会发生x==0&& y == 0 那么只有唯一的一种指令重排情况,需要运行的时间有点长。
package 高并发.mashibinggaobingfa;
import java.util.concurrent.CountDownLatch;
/**
* @author wenbaox
* @version 1.0
* @date 2021/5/14 下午10:51
*/
public class ZhiLingChongPai {
public static final int TOTAL = 1_000_000_000;
public static int a = 0, b = 0;
public static int x = 0, y = 0;
//验证指令重排
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < TOTAL; i++) {
a = 0;
b = 0;
x = 0;
y = 0;
CountDownLatch countDownLatch = new CountDownLatch(2);
new Thread(() -> {
a = 1;
x = b;
countDownLatch.countDown();
}).start();
new Thread(() -> {
b = 1;
y = a;
countDownLatch.countDown();
}).start();
countDownLatch.await();
System.out.println(x + " " + y + " " + i);
if (x == 0 && y == 0) {
System.out.println("i \t" + i);
break;
}
}
}
}