“CycliBarriar和CountdownLatch有什么区别”
一个工作4年的程序员去某互联网公司面试,被问到了这个问题。
如果大家不知道这个问题该怎么回答,可以扫描文章尾端二维码领取我整理的50W字的大厂面试指南。
问题分析
这两个类在进行线程并发控制的时候用得比较多,要能够完整的回答出这个问题,至少需要对这两个类有比较深度的理解。
(如图),CyclicBarrier,
它相当于一个线程的同步计数器,当计数器的值还没达到时,线程都会阻塞等待,直到达到设定的数值,所有线程都会被释放。
比如打篮球需要6个人,如果6个人没到齐之前,先到的人需要等待,直到最后一个人到了以后才能开始比赛。
CountDownLatch,实现一个或多个线程等待其他线程完成某个操作后再继续执行,一般可以用在多个线程之间需要相互等待,直到某个条件满足后才能继续执行的场景。
实际上CyclicBarrier和CountDownLatch在特性上有一定的相同点,所以要去对比它们的区别其实还是有一定难度的。
下面来看一下完整的回答。
问题解答
基于我的理解,我认为有三个方面的区别:
-
触发条件不同:CyclicBarrier在等待的线程数量达到指定值时,会触发一个屏障操作,所有线程都会被释放,并且屏障重置,可以被重用。CountDownLatch是通过一个计数器来触发等待操作,这个计数器的初始值为等待的线程数量,每当一个线程完成任务后,计数器就会减1,直到计数器为0时,所有等待的线程将被释放。
-
重用性不同:CyclicBarrier可以被重用,也就是在一组线程通过屏障后,可以再次使用。可以通过reset()方法可以重置CyclicBarrier的状态。CountDownLatch不能被重用,一旦计数器减为0,就不能再次使用。
-
线程协作方式不同:CyclicBarrier适合在一组线程互相等待达到共同的状态,然后同时开始或继续执行后续操作,并且它还可以额外置顶一个Runnable参数,当一组线程达到屏障点的时候可以优先触发。
CountDownLatch适用于一个或多个线程等待其他线程执行完成某个操作后再继续执行。比如在获取数据库连接之前,需要等待连接初始化完毕这个场景,就可以使用CountDownLatch。
总结
大家知道怎么回答了吗?
如果你喜欢我的作品,记得点赞收藏加关注哦!!!
另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前总计超过50W字!