为了账号安全,请及时绑定邮箱和手机立即绑定

面试官追问:CyclicBarrier 和 CountDownLatch 有啥区别?

标签:
Java JavaScript

原文来自于:https://zha-ge.cn/java/74

面试官追问: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 下自己继续冲呗!

– 程序员也得收个尾巴,写完这篇,泡杯咖啡继续下一个线程!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消