CycliBarriar和CountdownLatch有什么区别?

本文对比了CyclicBarrier和CountDownLatch在触发条件、重用性和线程协作方式上的差异,指出前者适用于线程同步和重用,后者则用于单次等待。提供了一个程序员面试中的实际问题情境并分享了详细的解答。
摘要由CSDN通过智能技术生成

“CycliBarriar和CountdownLatch有什么区别”

一个工作4年的程序员去某互联网公司面试,被问到了这个问题。

如果大家不知道这个问题该怎么回答,可以扫描文章尾端二维码领取我整理的50W字的大厂面试指南。

问题分析

这两个类在进行线程并发控制的时候用得比较多,要能够完整的回答出这个问题,至少需要对这两个类有比较深度的理解。

(如图),CyclicBarrier,

它相当于一个线程的同步计数器,当计数器的值还没达到时,线程都会阻塞等待,直到达到设定的数值,所有线程都会被释放。

比如打篮球需要6个人,如果6个人没到齐之前,先到的人需要等待,直到最后一个人到了以后才能开始比赛。

CountDownLatch,实现一个或多个线程等待其他线程完成某个操作后再继续执行,一般可以用在多个线程之间需要相互等待,直到某个条件满足后才能继续执行的场景。

img

实际上CyclicBarrier和CountDownLatch在特性上有一定的相同点,所以要去对比它们的区别其实还是有一定难度的。

下面来看一下完整的回答。

问题解答

基于我的理解,我认为有三个方面的区别:

  1. 触发条件不同:CyclicBarrier在等待的线程数量达到指定值时,会触发一个屏障操作,所有线程都会被释放,并且屏障重置,可以被重用。CountDownLatch是通过一个计数器来触发等待操作,这个计数器的初始值为等待的线程数量,每当一个线程完成任务后,计数器就会减1,直到计数器为0时,所有等待的线程将被释放。

  2. 重用性不同:CyclicBarrier可以被重用,也就是在一组线程通过屏障后,可以再次使用。可以通过reset()方法可以重置CyclicBarrier的状态。CountDownLatch不能被重用,一旦计数器减为0,就不能再次使用。

  3. 线程协作方式不同:CyclicBarrier适合在一组线程互相等待达到共同的状态,然后同时开始或继续执行后续操作,并且它还可以额外置顶一个Runnable参数,当一组线程达到屏障点的时候可以优先触发。

    CountDownLatch适用于一个或多个线程等待其他线程执行完成某个操作后再继续执行。比如在获取数据库连接之前,需要等待连接初始化完毕这个场景,就可以使用CountDownLatch。

 总结

大家知道怎么回答了吗?

如果你喜欢我的作品,记得点赞收藏加关注哦!!!

另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前总计超过50W字!

【想领取面试文档的小伙伴可以点击文章底部名片无套路免费赠送给大家!】

需要面试宝典、大厂面试文档的小伙伴可以扫描下方二维码
↓↓↓↓↓↓↓↓↓↓↓↓↓

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跟着Mic学架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值