这是一个关于指令重排序的疑问

来源: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回答

悟空

2021-01-10

因为代码2并不能真正意义的“复现重排序”,代码2的写法,会导致在两个子线程执行await之前,主线程就countDown了,所以两个子线程并没有同时运行,所以出现重排序的几率就很低了。

0
1
一天宏图
非常感谢!
2021-01-12
共1条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程