CountDownLatch
是 Java 并发包中的一个同步工具类,它允许一个或多个线程等待其他线程完成一组操作。其核心原理是通过一个计数器来实现线程间的同步。在创建 CountDownLatch
时指定一个初始计数值,每当一个线程完成任务并调用 countDown
方法时,计数器的值就会减 1。当计数器的值减至 0 时,所有等待的线程会被释放继续执行。
CountDownLatch
是一次性的,一旦计数器减至 0,CountDownLatch
就无法再次使用,需要重新创建。
例如,在多线程环境下,主线程需要等待其他线程完成一些初始化操作后才能继续执行。或者在一个并行计算任务中,需要等待所有子任务完成结果汇总。
CountDownLatch
的内部实现基于 AbstractQueuedSynchronizer
(AQS),通过一个名为 sync
的内部类来实现同步控制。sync
类继承自 AQS
,并实现了 tryAcquireShared
和 tryReleaseShared
方法来控制对共享资源的访问。当调用 countDown
方法时,会尝试减少计数器的值,当计数器减至 0 时,调用 await
方法的线程将被释放。
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3);
new Thread(() -> {
System.out.println("Thread 1 已启动。。。");
latch.countDown();
}).start();
new Thread(() -> {
System.out.println("Thread 2 已启动。。。");
latch.countDown();
}).start();
new Thread(() -> {
System.out.println("Thread 3 已启动。。。");
latch.countDown();
}).start();
latch.await();
System.out.println("All threads completed。。。");
}
}
在这个示例中,我们创建了一个 CountDownLatch
实例,并将需要等待的线程数设置为 3。然后,我们启动 3 个线程来执行任务,每个线程执行完任务后调用 countDown
方法将计数器减 1。最后,在主线程中我们调用 await
方法来使当前线程等待,直到所有线程完成任务并计数器减为 0 为止。
通过上述分析,我们可以看到 CountDownLatch
是一个简单而强大的同步工具,适用于多种多线程场景。
领取专属 10元无门槛券
手把手带您无忧上云