AQS(AbstractQueuedSynchronizer)是一个用于构建锁和同步器的框架,许多同步器都可以通过AQS很容易并且高效地构造出来。
不仅 ReentrantLock 和 Semaphore 是基于AQS构建的,还包括 CountDownLatch、ReentrantReadWriteLock、SynchronousQueue 和 FutureTask。
AQS 的实现类主要是在 ReentrantLock
,Semaphore
, CountDownLatch
中内部的 Sync
类,和 ReentrantLock
的实现方式相似。
特点:
-
用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁
- getState - 获取 state 状态
- setState - 设置 state 状态
- compareAndSetState - cas机制设置 state 状态
- 独占模式是只有一个线程能供访问资源,而共享模式可以允许多个线程访问资源
-
提供了基于 FIFO 的等待队列,类似于 Monitor 的 EntryList
-
条件变量来实现等待、唤醒机制,支持多个条件变量,类似于 Monitor 的 WaitSet
-
根据同步器的不同,获取操作可以是一种独占操作(例如 ReentrantLock),也可以是一个非独占操作(例如 Semaphore 和 CountDownLatch)。
共享模式和独占模式的区别主要在于使用的方式不同
ReentrantLock 主要是 独占模式,Semaphore 和CountDownLatch 是非独占模式。
tryAcquireShared 方法首先计算剩余许可(remaining)的数量,如果没有足够的许可,那么会返回一个值表示获取操作失败。如果还有剩余的许可,那么 tryAcquireShared 会通过 compareAndSetState 以原子方式来降低许可的计数。如果这个操作成功(这意味着许可的计数自从上一次读取后就没有被修改过),那么将返回一个值表示获取操作成功。