面试官追问:CyclicBarrier 和 CountDownLatch 有啥区别?
面试官追问:CyclicBarrier 和 CountDownLatch 有啥区别?
还记得那年秋天的面试,阳光明媚,我自信满满地蹦进了会议室。结果刚坐下,面试官抬头问我:“你说说,CyclicBarrier 和 CountDownLatch 有啥区别?”
我心里咯噔一下:果然是老江湖,开局一手多线程!本以为这玩意儿就“等待一下大家”,硬着头皮张口就来,差点当场翻车……
江湖传说的二人组
这俩货,刚听名字就像一对技能点满的队友。先看下基本用途:
- CountDownLatch:计数器,一顿 countDown,等计数变零释放等待线程。比如比赛枪响,所有参赛者一起冲。
- CyclicBarrier:栅栏,大家都得等到位了才能一起通过,可以反复用,像团建集体爬山集合点,没人能早溜。
我当年第一次用这俩,心想都能“让一堆线程一起行动”,那区别是不是只是名字长短?
那年亲自上阵
实际干起来,才发现门道可真不少。比如下面这个小片段:
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("都到了,出发!"));
for (int i = 0; i < 3; i++) {
new Thread(() -> {
// ...
barrier.await();
}).start();
}
CountDownLatch 的味道则是这样的:
CountDownLatch latch = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
new Thread(() -> {
// ...
latch.countDown();
}).start();
}
latch.await();
在键盘噼里啪啦的时候,我已经开始意识到:
- 一个像集体闯关(栅栏),到点一起搞。
- 一个像任务集结号,你先走没事,等老大哥叫停才算真正结束。
踩坑瞬间
有一回我图简单,直接把 CyclicBarrier 当 CountDownLatch 用,把主线程也拉到 barrier 里,结果卡得死死的。原来 barrier 是等所有人到岗才“炸开栅栏”,不按人数指定好——直接原地殉情。线程数错了?准备陪 barrier 玩“谁也别走”小游戏吧。
而 CountDownLatch 用多了还发现,latch 是一次性的,等完就作废。想多等几波?不好意思,reset 不支持。那会我项目有多个批次要用 latch,只能搞好几个实例,啃着代码泪两行。
经验启示
费劲巴拉踩了几次坑,才总结出点门道:
| 特性 | CyclicBarrier | CountDownLatch |
|---|---|---|
| 可重用 | 是(cyclic !!) | 否 |
| 谁等谁 | 所有调用 await 的线程 | 只有主线程 await |
| 一次到齐后? | 可 reset 再用 | 直接作废 |
| 应用场景 | 多线程阶段同步 | 一次性关卡解锁 |
| 支持回调 | 有(barrierAction) | 没有 |
简单一句话:
- CyclicBarrier:大家都到位一起嗨,再来一次都成。
- CountDownLatch:等兄弟们都搞完我再收工,用一次就拉倒。
最后的唠嗑
如果下一次你也面对 “CyclicBarrier 和 CountDownLatch 有啥区别”这神仙提问,绝对别只说“都是线程同步工具”那种教科书八股。
讲一下谁等谁、谁能反复用、啥时候出发,甭管技术面还是“故事面”,肯定能留个好印象。
至于我?终于从 barrier 坑爬出来,开始觉得并发面试算啥,人生不过就是过关斩将、错个 barrier,大不了 reset 下自己继续冲呗!
– 程序员也得收个尾巴,写完这篇,泡杯咖啡继续下一个线程!
共同学习,写下你的评论
评论加载中...
作者其他优质文章