这是一个关于指令重排序的疑问
来源:12-10 可见性问题

一天宏图
2021-01-10
老师:请看下面代码: 这是一个关于指令重排序的疑问
第一个问题:
1.CountDownLatch countDownLatch=new CountDownLatch(3);
在每个线程和主线程中使用countDown
ThreadOne{
countDownLatch.countDown();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
…
2.CountDownLatch countDownLatch=new CountDownLatch(1);
然后在主线程下方
countDownLatch.countDown();
发现代码1比代码2导致重排序 来的快了很多 , 疑问:这不都是解除栅栏让线程同时跑吗? 一个一次解除了一个 ,一个是解除3个 为什么解除3个的比解除1个的更容易更早的出现重排序呢?
写回答
1回答
-
因为代码2并不能真正意义的“复现重排序”,代码2的写法,会导致在两个子线程执行await之前,主线程就countDown了,所以两个子线程并没有同时运行,所以出现重排序的几率就很低了。
012021-01-12
相似问题