Java 中 CountDownLatch 的作用是什么?

· 约 3 分钟读完 · 第 81 / 274 章

推荐答案

CountDownLatch 是 Java 并发包中的一个同步工具类,用于协调多个线程之间的同步操作。它允许一个或多个线程等待其他线程完成操作后再继续执行。

本题详细解读

1. CountDownLatch 的基本概念

CountDownLatch 通过一个计数器来实现同步。计数器的初始值由构造函数指定,表示需要等待的线程数量。每当一个线程完成了自己的任务后,计数器的值就会减一。当计数器的值减到零时,表示所有需要等待的线程都已经完成了任务,此时等待的线程(通常是主线程)就可以继续执行。

2. CountDownLatch 的主要方法

  • CountDownLatch(int count): 构造函数,初始化计数器,count 表示需要等待的线程数量。
  • void await(): 使当前线程等待,直到计数器的值减到零。如果计数器的值已经为零,则该方法立即返回。
  • boolean await(long timeout, TimeUnit unit): 使当前线程等待,直到计数器的值减到零,或者等待时间超过指定的超时时间。如果计数器的值在超时时间内减到零,则返回 true,否则返回 false。
  • void countDown(): 将计数器的值减一。如果计数器的值减到零,则所有等待的线程将被唤醒。
  • long getCount(): 返回当前计数器的值。

3. CountDownLatch 的使用场景

CountDownLatch 通常用于以下场景:

  • 主线程等待多个子线程完成任务后再继续执行:例如,主线程需要等待多个子线程完成初始化操作后再执行后续任务。
  • 多个线程等待某个事件发生后再继续执行:例如,多个线程需要等待某个资源初始化完成后才能开始执行任务。

4. 示例代码

在这个示例中,主线程创建了 3 个子线程,并使用 CountDownLatch 来等待所有子线程完成任务。每个子线程完成任务后调用 countDown() 方法将计数器减一,主线程通过 await() 方法等待计数器减到零后再继续执行。

5. 注意事项

  • CountDownLatch 的计数器只能减不能增,一旦计数器减到零,就不能再重置。
  • CountDownLatch 适用于一次性同步操作,如果需要多次同步,可以考虑使用 CyclicBarrier。