CountDownLatch是如何基于AQS实现的?
时间: 2023-08-14 20:12:18 浏览: 199
CountDownLatch 是基于 AbstractQueuedSynchronizer (AQS) 实现的。
AQS 是 Java 并发包中的一个框架,它提供了一种实现同步器的基础框架。CountDownLatch 内部通过继承 AQS 来实现同步功能。
CountDownLatch 继承了 AQS,并重写了其中的 tryAcquireShared() 和 tryReleaseShared() 方法来实现计数器的控制。
tryAcquireShared(int arg) 方法用于尝试获取共享资源。在 CountDownLatch 中,当计数器不为0时,线程调用 await() 方法时会进入等待队列,尝试获取共享资源失败,进入等待状态。当计数器减到0时,线程调用 countDown() 方法会执行 tryReleaseShared(int arg) 方法,将计数器减1,并唤醒等待队列中的线程。
tryReleaseShared(int arg) 方法用于释放共享资源。在 CountDownLatch 中,当计数器减到0时,调用 countDown() 方法会执行 tryReleaseShared(int arg) 方法,将计数器减1,并唤醒等待队列中的线程。
通过 AQS 的状态和等待队列机制,CountDownLatch 实现了线程等待和唤醒的功能,实现了多个线程之间的同步。
相关问题
详细介绍下AQS 原理?AQS 组件有哪些?
AQS(AbstractQueuedSynchronizer)是 Java 并发包中一个重要的同步组件,它通过内部维护一个 FIFO 队列来实现同步协作,是很多同步组件的基础,例如 ReentrantLock、CountDownLatch、Semaphore 等。
AQS 内部基于一个 int 类型的变量 state 来表示同步状态,当 state 为 0 时表示未锁定状态,当 state 大于 0 时表示已锁定状态,小于 0 时表示 state 的绝对值是等待获取同步状态的线程个数。AQS 的操作主要包括独占和共享两种模式,独占模式下只有一个线程能够获取同步状态,共享模式下可以有多个线程同时获取同步状态。
AQS 的核心是一个双向链表,其中每个节点表示一个等待线程,通过 CAS 操作来实现节点的加入和移除。在独占模式下,等待线程会被加入到队列的尾部,当前获取同步状态的线程是队列头部的节点,当当前线程释放同步状态后,会唤醒队列中的下一个节点。在共享模式下,等待线程也会被加入到队列的尾部,但是当前获取同步状态的线程可能是队列中的任意一个节点,当当前线程释放同步状态后,会唤醒队列中的所有节点。
AQS 组件包括以下几种:
1. ReentrantLock:可重入锁,支持公平和非公平两种模式。
2. ReentrantReadWriteLock:读写锁,支持读写分离。
3. Semaphore:信号量,用于控制资源的并发访问量。
4. CountDownLatch:倒计时门闩,用于等待其他线程完成一定的操作后再执行。
5. CyclicBarrier:循环屏障,用于等待一组线程达到某个状态后再执行。
6. Condition:条件变量,用于在某个条件下等待或唤醒线程。
以上就是 AQS 的基本原理和组件介绍。
以下关于 CountDownLatch 和 CyclicBarrier 的描述中,哪一项是错误的? A. CountDownLatch 与 CyclicBarrier 都是 java.util.concurrent 包下的线程同步工具类 B. CountDownLatch 与 CyclicBarrier 都可以用于“主线程阻塞一直等待,直到子任务完成,主线程才继续执行”的情况 C. CountDownLatch 的 await()方法会等待计数器归 0,而 CyclicBarrier 的 await()会等待其他线程到达 barrier point D. CountDownLatch 是由 Lock 和 Condition 实现的,而 CyclicBarrier 是由同步控制器 AQS 实现的
选项 D 中的描述是错误的。
CountDownLatch 和 CyclicBarrier 都是 java.util.concurrent 包下的线程同步工具类,都可以用于协调多个线程之间的执行顺序,等待其他线程执行完成等情况。
CountDownLatch 的 await() 方法会等待计数器归 0,而 CyclicBarrier 的 await() 方法会等待其他线程到达 barrier point,即等待所有线程都到达同一个屏障点,然后再一起继续执行。
CountDownLatch 是由 AQS 实现的,而 CyclicBarrier 也是由 AQS 实现的。AQS 是 AbstractQueuedSynchronizer 的缩写,是一个提供了基于锁和条件变量的同步框架的抽象类,CountDownLatch 和 CyclicBarrier 都是基于 AQS 的实现。
因此,选项 D 中的描述是错误的。
阅读全文
相关推荐
















