姚同学 录屏 音乐 摸鱼 压图
多线程并发

CountDownLatch简介

CountDownLatch是Java并发包java.util.concurrent中的一种同步工具,它允许一个或多个线程等待其他线程完成操作后再继续执行。其核心思想是通过一个计数器来实现线程间的协调。

典型应用场景

1.并发计算结果汇总:多个子线程并行处理任务,主线程等待所有子线程完成后汇总结果。

2.模拟高并发场景:例如秒杀活动,让所有请求线程在同一时刻并发执行,以实现最大并行度。

潜在风险与优化建议

在高并发场景下,若线程池核心线程数配置不足,可能出现“线程饥饿”现象:所有线程均被阻塞等待,导致新任务无法获得执行资源,最终形成死锁。解决方案包括:

-合理扩大线程池规模;

-配置拒绝策略(如CallerRunsPolicy)避免任务无限堆积;

-使用独立线程池隔离不同业务,降低相互影响。

CyclicBarrier简介

CyclicBarrier同样是java.util.concurrent包提供的同步辅助类,它让一组线程互相等待,直到所有线程都到达公共屏障点(barrier)后才继续执行。与CountDownLatch不同的是,CyclicBarrier的计数器可通过reset()方法循环使用,因此适用于多轮重复任务。

CyclicBarrier的核心特性

1.固定数量的线程必须彼此等待,达到屏障点后统一放行;

2.支持屏障循环使用,所有线程释放后,屏障自动复位,可进入下一轮等待;

3.提供getNumberWaiting()方法查询当前阻塞线程数;

4.提供isBroken()方法判断屏障是否被中断或异常破坏;

5.支持在屏障点触发可选的回调任务(Runnable),便于合并计算结果或记录日志。

CyclicBarrier典型应用场景

多线程分批计算:例如按部门统计全年平均工资,每轮并行计算一个部门,所有线程计算完毕后汇总,再进入下一轮计算。由于需要重复多轮,CyclicBarrier比CountDownLatch更为合适。

CountDownLatch与CyclicBarrier的区别总结

1.计数器复用:CountDownLatch只能使用一次;CyclicBarrier可通过reset()反复使用。

2.异常处理:CyclicBarrier支持在计算异常时结束阻塞、重置计数器并重新执行,更适合复杂业务场景。

3.查询与监控:CyclicBarrier提供getNumberWaiting()、isBroken()等API,方便监控线程状态;CountDownLatch无此类接口。

4.阻塞范围:CountDownLatch仅阻塞调用await()的线程(通常是主线程);CyclicBarrier阻塞所有参与线程,直到最后一方到达屏障。