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

相关推荐
Porunarufu39 分钟前
Java·关于List
java·开发语言
靠沿1 小时前
Java数据结构初阶——Collection、List的介绍与ArrayList
java·数据结构·list
程序猿小蒜1 小时前
基于springboot的的学生干部管理系统开发与设计
java·前端·spring boot·后端·spring
q***56381 小时前
Spring容器初始化扩展点:ApplicationContextInitializer
java·后端·spring
q***51891 小时前
SpringCloud系列教程:微服务的未来(十四)网关登录校验、自定义过滤器GlobalFilter、GatawayFilter
java·spring cloud·微服务
go__Ahead2 小时前
【Java】线程池源码解析
java·juc
wyhwust2 小时前
数组----插入一个数到有序数列中
java·数据结构·算法
专注于大数据技术栈2 小时前
java学习--final
java·开发语言·学习
天殇凉3 小时前
AC自动机学习笔记
java·笔记·学习
TechTrek3 小时前
Spring Boot 4.0正式发布了
java·spring boot·后端·spring boot 4.0