interview
java-concurrency
什么是 Java 的 CountDownLatch

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() 方法上等待的线程。

用途

在面试中问这个问题的目的是为了评估候选人对 Java 并发编程的理解和掌握程度。CountDownLatch 是 Java 并发包中的一个常用工具,可以用于很多场景,例如:确保某些任务在其他任务完成后再执行、模拟并发场景进行测试、实现简单的多线程协作等。在实际生产环境中,使用 CountDownLatch 可以帮助开发人员更好地控制线程的执行顺序,提高程序的可靠性和效率。\n

相关问题

🦆
什么是 Java 的 CyclicBarrier?

CyclicBarrier 是 java.util.concurrent 包中的一个同步辅助类,用于使一组线程互相等待,直到所有线程都到达某个公共屏障点。CyclicBarrier 可以重复使用,而 CountDownLatch 是一次性的。

🦆
什么是 Java 的 Semaphore?

Semaphore 是一种计数信号量,用来控制同时访问特定资源的线程数量。通过 acquire() 和 release() 方法来获取和释放许可。

🦆
什么是 Java 的 ReentrantLock?

ReentrantLock 是 java.util.concurrent.locks 包中的一个可重入的互斥锁,提供了与 synchronized 关键字类似的互斥功能,但比 synchronized 提供了更多的功能,如公平锁、可中断锁等。

🦆
什么是 Java 的 Phaser?

Phaser 是一个比 CountDownLatch 和 CyclicBarrier 更加灵活和复杂的同步工具,允许动态增加和减少参与的线程数量,并支持多个阶段的同步。

🦆
如何实现一个线程安全的单例模式?

可以使用双重检查锁定(Double-Checked Locking)与 volatile 关键字来实现一个线程安全的单例模式。这样可以确保在多线程环境下单例对象的唯一性和延迟初始化。

🦆
什么是 Java 的 ForkJoin 框架?

Fork/Join 框架是 Java 7 引入的一种用于并行任务处理的框架。它通过将大任务拆分成小任务来提高并行执行的效率,使用了工作窃取算法来优化线程的利用率。