CountDownLatch详解

CountDownLatch 是 Java 并发工具类,基于计数器实现线程等待机制。通过 await() 阻塞线程直到计数器归零,countDown() 减少计数。常用于主线程等待多个子线程完成任务,或控制多线程同时启动。


一、核心功能

  • 初始化计数器:创建时指定计数值(不可重置)。
  • 线程阻塞 :调用 await() 的线程会阻塞,直到计数器归零。
  • 计数递减 :子线程完成任务后调用 countDown(),计数器减 1。

二、核心方法

方法 说明
CountDownLatch(int count) 构造方法,初始化计数器
void await() 阻塞当前线程,直到计数器归零
boolean await(long timeout, TimeUnit unit) 带超时的等待,超时后继续执行
void countDown() 计数器减 1(线程安全)
long getCount() 获取当前计数值

三、典型使用场景

  1. 主线程等待子线程就绪
    例如:主线程等待多个服务初始化完成后,再处理后续任务。
  2. 多线程任务拆分与汇总
    例如:将大任务拆分为多个子任务,所有子任务完成后再合并结果。
  3. 并发测试
    模拟高并发场景,让所有线程同时开始执行。

四、代码示例

java 复制代码
public class CountDownLatchDemo {
    public static void main(String[] args) throws InterruptedException {
        int threadCount = 5;
        CountDownLatch latch = new CountDownLatch(threadCount);

        for (int i = 0; i < threadCount; i++) {
            new Thread(() -> {
                System.out.println("子线程执行任务...");
                latch.countDown(); // 任务完成,计数器减1
            }).start();
        }

        latch.await(); // 主线程等待所有子线程完成任务
        System.out.println("所有子线程执行完毕,主线程继续!");
    }
}

五、注意事项

  1. 计数器不可重置
    若需重复使用,应选择 CyclicBarrier
  2. 避免死锁
    确保所有线程最终都会调用 countDown(),否则主线程无限阻塞。
  3. 性能优化
    避免在高并发场景下频繁创建 CountDownLatch
  4. 异常处理
    finally 块中调用 countDown(),防止线程异常导致计数未减少。

六、对比 CyclicBarrier

特性 CountDownLatch CyclicBarrier
重用性 不可重置(一次性) 可重复使用
核心角色 主线程等待子线程 子线程相互等待
触发条件 计数器归零 所有线程到达屏障点

总结
CountDownLatch 是轻量级线程协调工具,适用于"一等多"或"多等一"场景。通过计数器机制简化多线程协作,但需注意其不可重置的特性。

相关推荐
呱牛do it4 小时前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 3)
java·vue
神の愛5 小时前
左连接查询数据 left join
java·服务器·前端
南境十里·墨染春水5 小时前
linux学习进展 线程同步——互斥锁
java·linux·学习
雨奔5 小时前
Kubernetes 联邦 Deployment 指南:跨集群统一管理 Pod
java·容器·kubernetes
杨凯凡5 小时前
【021】反射与注解:Spring 里背后的影子
java·后端·spring
lulu12165440785 小时前
Claude Code项目大了响应慢怎么办?Subagents、Agent Teams、Git Worktree、工作流编排四种方案深度解析
java·人工智能·python·ai编程
riNt PTIP5 小时前
SpringBoot创建动态定时任务的几种方式
java·spring boot·spring
老星*6 小时前
AI选股核心设计思路
java·ai·开源·软件开发
それども6 小时前
Comparator.comparing 和 拆箱问题
java·jvm
星晨羽7 小时前
西门子机床opc ua协议实现变量读写及NC文件上传下载
java·spring boot