CountDownLatch详解

CountDownLatch详解

概述

CountDownLatch是Java并发包(java.util.concurrent)中的一种同步工具类,允许一个或多个线程等待其他线程完成操作。

核心原理

  • 维护一个计数器,初始化为正数
  • 每当一个任务完成,调用countDown()减1
  • 调用await()的线程阻塞,直到计数器为0

基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
int count = 3;
CountDownLatch latch = new CountDownLatch(count);

for (int i = 0; i < count; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + " 完成");
} finally {
latch.countDown();
}
}).start();
}

latch.await(); // 等待所有线程完成
System.out.println("所有任务完成");
}
}

常见场景

1. 等待多个任务完成

1
2
3
4
5
6
CountDownLatch latch = new CountDownLatch(n);
executors.submit(() -> {
// 执行任务
latch.countDown();
});
latch.await();

2. 启动多个线程后同时执行

1
2
3
4
5
6
7
8
CountDownLatch startLatch = new CountDownLatch(1);
for (int i = 0; i < n; i++) {
new Thread(() -> {
startLatch.await(); // 等待开始信号
// 同时执行
}).start();
}
startLatch.countDown(); // 一次性释放所有线程

注意事项

  • 计数器不能被重置
  • await()可设置超时
  • 不保证线程安全

总结

CountDownLatch是简单实用的线程同步工具,适用于等待多任务完成的场景。