CountDownLatch是如何基于AQS实现的?
时间: 2023-08-14 10:12:18 浏览: 198
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 的基本原理和组件介绍。
阅读全文
相关推荐

















