继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

我就是渣哥
关注TA
已关注
手记 106
粉丝 1
获赞 3

原文来自于: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 下自己继续冲呗!

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

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP