录屏 音乐 摸鱼 压图
CountDownLatch是Java并发包java.util.concurrent中的一种同步工具,它允许一个或多个线程等待其他线程完成操作后再继续执行。其核心思想是通过一个计数器来实现线程间的协调。
1.并发计算结果汇总:多个子线程并行处理任务,主线程等待所有子线程完成后汇总结果。
2.模拟高并发场景:例如秒杀活动,让所有请求线程在同一时刻并发执行,以实现最大并行度。
在高并发场景下,若线程池核心线程数配置不足,可能出现“线程饥饿”现象:所有线程均被阻塞等待,导致新任务无法获得执行资源,最终形成死锁。解决方案包括:
-合理扩大线程池规模;
-配置拒绝策略(如CallerRunsPolicy)避免任务无限堆积;
-使用独立线程池隔离不同业务,降低相互影响。
CyclicBarrier同样是java.util.concurrent包提供的同步辅助类,它让一组线程互相等待,直到所有线程都到达公共屏障点(barrier)后才继续执行。与CountDownLatch不同的是,CyclicBarrier的计数器可通过reset()方法循环使用,因此适用于多轮重复任务。
1.固定数量的线程必须彼此等待,达到屏障点后统一放行;
2.支持屏障循环使用,所有线程释放后,屏障自动复位,可进入下一轮等待;
3.提供getNumberWaiting()方法查询当前阻塞线程数;
4.提供isBroken()方法判断屏障是否被中断或异常破坏;
5.支持在屏障点触发可选的回调任务(Runnable),便于合并计算结果或记录日志。
多线程分批计算:例如按部门统计全年平均工资,每轮并行计算一个部门,所有线程计算完毕后汇总,再进入下一轮计算。由于需要重复多轮,CyclicBarrier比CountDownLatch更为合适。
1.计数器复用:CountDownLatch只能使用一次;CyclicBarrier可通过reset()反复使用。
2.异常处理:CyclicBarrier支持在计算异常时结束阻塞、重置计数器并重新执行,更适合复杂业务场景。
3.查询与监控:CyclicBarrier提供getNumberWaiting()、isBroken()等API,方便监控线程状态;CountDownLatch无此类接口。
4.阻塞范围:CountDownLatch仅阻塞调用await()的线程(通常是主线程);CyclicBarrier阻塞所有参与线程,直到最后一方到达屏障。