天天看点

Java面试题解析:CountdownLatch和CycliWJar有什么区别?一位工作5年的小伙伴在面试的时候被问到这

作者:Tom弹架构

Java面试题解析:CountdownLatch和CycliWJar有什么区别?

一位工作5年的小伙伴在面试的时候被问到这样一个问题,说看的当烂企和 CountdownLatch有什么区别?这个问题对于很多人都比较陌生,但是对于接触过并发编程的小伙伴来说还是比较简单的。今天我给大家分享一下我对这个问题的理解。这道面试题的文字版我已经整理在20万字的文档里面了,有需要的小伙伴可以在评论区领取。

·首先来看CountDownLatch,它是一个组合词,CountDown的意思是倒计时。Latch它的意思是门闩的意思也被翻译成发令枪,在JDK中注释是这样的,翻译过来就是说让一个或者多个线程持续等待,直到等到其它多个线程执行一组的操作。全部完成以后这些等待的线程才会继续执行。

就好比是有多位选手参加一场百米比赛,裁判员需要等待全部选手就绪,并且在同一起跑线上。然后裁判员就会发出号令各就位预备跑。随着发令枪一响所有的选手才会开始全部起跑。在这个场景中各个参赛选手就是线程,而裁判就是CountDownLatch。在实际开发中有以下两个使用场景可以使用到CountDownLatch来实现。

·第一个就是让单个线程等待多个线程的场景。比如说一个服务需要从多个远程接口去获取数据,可以去创建多个线程来分别调用远程的接口,等待所有的接口。全部获取到返回值之后主线程才继续往下执行,比如像并发计算结果汇总等等。

·第二个就是让多个线程等待的场景。比如说模拟秒杀场景,让一种线程同时等待,同时去恢复执行。实现最大程度的可能性。需要注意的是当高并发请求的时候看到Countdownlatch的await方法有可能会引起死锁。

因为如果线程池中的线程数量比较少,在高并发的时候会出现多个请求占用了全部的线程,但是每个请求又需要await()其它线程,被等待的线程拿不到线程资源无法执行从而导致多个请求无法同时进入线程阻塞,最后形成死锁。

当然可以使用自定义的线程池来扩大线程数量,并且建立线程的拒绝机制来解决死锁问题。

再来看线程里的线程也是一个组合词,其中Cyclic的意思是循环,而Barrier的意思是屏障又被翻译成栅栏。在JDK中注释是这样描述的,翻译过来总结为以下三点:

·第一个是线程里的线程是一个同步的辅助类,它允许一组线程相互等待,直到所有的线程都达到一个公共的屏障点。

·第二个是在程序中有固定的数量的线程,这些线程有时候必需要等待彼此,这种情况下使用Cyclic棱角r很有帮助。

·第三个是这个屏障之所以要使用循环修饰是因为所有线程的被释放彼此之后这个屏障可以去重复使用,从字面上理解它的功能和CountdownLatch是非常相似的,也就是说要等待所有参加比赛的选手全部就绪以后才能开始起跑。它是另外一种多线程并发的控制工具,和CountdownLatch不同的是Cyclic棱角r可以重复使用。在实际开发中再给你一个CyclicBarrier可以用于多线程计数数据,最后合并计算结果的应用场景。

比如说需要计算N组人的一年的平均工资,每组需要多个线程进行并行计算,计算完一组再开始计算下一组,这样就需要多轮并行计算,在这个场景下CyclicBarrier比CountDownLatch更适合。

最后我给大家总结一下CountDownLatch和CyclicBarrier的区别,我从以下四个方面来分析。

·第一个是CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法来重置,反复使用。

·第二个是yclic·r它能处理更为复杂的业务场景,比如计算发生错误可以结束阻塞、重置计算器以及重新执行程序。

·第三个是Cyclic棱角r提供了getNumberWaiting(方法可以去获得)。

Cyclic回应核长度的数目数目还提供了一丝蜂胶()方法,可以去判断主摄性线索是否被中断。

两者区别结尾:

·第四个,CountDownLatch 会阻塞主程,而Cyclic男方不会去阻塞主工程,只会阻塞子线程。

以上就是我对Java面试奇和萨克里克拜瑞的理解,我是被编程耽误的文艺Tom,如果我的分享对你有帮助,请你动动手指一键三连,分享给更多的人。关注我,面试不再难!

Java面试题解析:CountdownLatch和CycliWJar有什么区别?一位工作5年的小伙伴在面试的时候被问到这
Java面试题解析:CountdownLatch和CycliWJar有什么区别?一位工作5年的小伙伴在面试的时候被问到这
Java面试题解析:CountdownLatch和CycliWJar有什么区别?一位工作5年的小伙伴在面试的时候被问到这
Java面试题解析:CountdownLatch和CycliWJar有什么区别?一位工作5年的小伙伴在面试的时候被问到这
Java面试题解析:CountdownLatch和CycliWJar有什么区别?一位工作5年的小伙伴在面试的时候被问到这
Java面试题解析:CountdownLatch和CycliWJar有什么区别?一位工作5年的小伙伴在面试的时候被问到这
Java面试题解析:CountdownLatch和CycliWJar有什么区别?一位工作5年的小伙伴在面试的时候被问到这

继续阅读