Java 并发面试题, 什么是 Java 的 CountDownLatch?
Java 并发面试题, 什么是 Java 的 CountDownLatch?
QA
Step 1
Q:: 什么是 Java 的 CountDownLatch?
A:: CountDownLatch 是 java.util.concurrent 包中的一个同步辅助类,用来协调多个线程之间的同步。它允许一个或多个线程等待,直到其他线程完成一组操作。CountDownLatch 初始化时会设置一个计数值,每当一个线程完成了它的工作并调用 countDown() 方法时,这个计数值就会减一。当计数值减到零时,所有在 await()
方法上等待的线程都会被唤醒并继续执行。
Step 2
Q:: CountDownLatch 的主要方法有哪些?
A:: CountDownLatch 的主要方法包括:
1. 构造方法 CountDownLatch(int count)
:初始化 CountDownLatch 并设置计数值。
2. countDown()
:递减计数,当计数减到零时,所有等待的线程将被唤醒。
3. await()
:使当前线程在锁存器倒计数至零之前一直等待。
4. await(long timeout, TimeUnit unit)
:使当前线程在锁存器倒计数至零之前一直等待,除非等待被中断或超出了指定的等待时间。
Step 3
Q:: CountDownLatch 和 CyclicBarrier 有什么区别?
A:: CountDownLatch 和 CyclicBarrier 都是用于多线程同步的工具,但它们有不同的用途。CountDownLatch 用于一个或多个线程等待一组操作完成,而 CyclicBarrier 则用于一组线程互相等待,直到到达某个公共屏障点。CountDownLatch 的计数值是一次性的,而 CyclicBarrier 可以重复使用。
Step 4
Q:: 如何在实际中使用 CountDownLatch?
A:: 假设有一个场景,需要启动多个服务线程,然后等待所有服务线程启动完成之后再执行其他操作。这时就可以使用 CountDownLatch。可以初始化 CountDownLatch 并设置计数值为服务线程的数量,每个服务线程启动完成后调用 countDown() 方法,主线程调用 await()
方法等待计数值变为零。
Step 5
Q:: CountDownLatch 的实现原理是什么?
A:: CountDownLatch 的实现基于 AQS(AbstractQueuedSynchronizer)。当 CountDownLatch 被创建时,它会将初始计数值传递给 AQS 的共享资源。每次调用 countDown() 时,AQS 将共享资源减一,当共享资源值为零时,AQS 会唤醒所有在 await()
方法上等待的线程。