在Java并发编程里,CountDownLatch是一个位于java.util.concurrent包下的同步工具类。它内部维护一个计数器,初始化时指定数量,线程可以通过await方法等待,直到计数器变为0才继续往下走。另一些线程在完成任务后调用countDown方法,让计数减一。借助这种机制,我们可以很方便地控制多个线程之间的执行顺序,比如让主线程等所有子线程初始化完毕再运行。

CountDownLatch核心方法
使用CountDownLatch主要依赖下面几个方法:
- CountDownLatch(int count):构造方法,设置初始计数。
- await():调用线程阻塞,直到计数为0或线程被中断。
- countDown():计数减一,如果减到0则唤醒所有等待的线程。
- await(long timeout, TimeUnit unit):带超时的等待。
用CountDownLatch控制线程顺序的示例
假设我们有一个需求:启动三个工作线程去做准备,全部准备好之后,主线程才继续执行后续逻辑。代码如下:
import java.util.concurrent.CountDownLatch;
public class LatchDemo {
public static void main(String[] args) throws InterruptedException {
// 初始计数为3,表示需要等待3个线程就绪
CountDownLatch readyLatch = new CountDownLatch(3);
for (int i = 1; i <= 3; i++) {
final int id = i;
new Thread(() -> {
try {
// 模拟准备工作耗时
Thread.sleep(500);
System.out.println("线程" + id + "准备完成");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
// 任务完成,计数减一
readyLatch.countDown();
}
}).start();
}
// 主线程等待,直到计数归零
readyLatch.await();
System.out.println("所有线程已就绪,主线程开始执行");
}
}
注意事项
CountDownLatch的计数器只能使用一次,不能重置。如果需要可重用的计数同步,应考虑使用CyclicBarrier。另外,在调用countDown方法时最好放在finally块中,防止任务异常导致计数永远不减,从而使await线程一直阻塞。
总结
通过CountDownLatch,我们可以用很直观的方式安排线程的先后执行关系,不必依赖Thread.join挨个等待,也不会因为锁使用不当产生死锁。理解它的计数模型和await、countDown配合方式,是写出清晰并发代码的基础。
JavaCountDownLatch多线程修改时间:2026-07-27 07:54:14