AQS,全称AbstractQueuedSynchronizer,是Java中用于构建同步器的抽象基类。它提供了一种基于FIFO等待队列的机制,允许开发者实现各种同步工具,如锁、信号量、倒计时器等。下面是对AQS的详细解释:
-
AQS 概述:
- AQS 是一个用于构建锁和其他同步工具的框架。
- 它提供了一种基于状态的抽象,通过维护一个状态值来表示同步对象的状态。
- AQS 内部使用一个等待队列(FIFO 双向队列)来管理多个线程的竞争关系。
-
AQS 主要组成部分:
- State(状态): 用来表示同步对象的状态,可以是共享的或独占的。
- Queue(等待队列): 用来保存等待线程的引用,以及它们的状态。
-
AQS 的核心方法:
- acquire(int arg): 用于获取同步状态。如果获取成功,方法会立即返回;否则,线程将被阻塞,加入等待队列。
- release(int arg): 用于释放同步状态。释放成功后,会尝试唤醒等待队列中的其他线程。
-
AQS 的实现方式:
- AQS 使用了模板方法模式,将具体同步器的实现交给了子类。
- 子类需要实现 tryAcquire 和 tryRelease 方法来定制独占锁的获取和释放逻辑。
-
同步器的两种模式:
- Exclusive(独占): 一个时刻只有一个线程持有锁。
- Share(共享): 多个线程可以同时持有锁。
-
AQS 中的模板方法:
- tryAcquire(int arg): 独占式获取同步状态的权限。子类实现该方法来定义获取同步状态的逻辑。
- tryRelease(int arg): 独占式释放同步状态的权限。子类实现该方法来定义释放同步状态的逻辑。
- tryAcquireShared(int arg): 共享式获取同步状态的权限。
- tryReleaseShared(int arg): 共享式释放同步状态的权限。
-
AQS 使用场景:
- ReentrantLock 和 ReentrantReadWriteLock: AQS 的典型应用,用于构建可重入锁和可重入读写锁。
- Semaphore 和 CountDownLatch: 通过 AQS 实现的信号量和倒计时器。
- Condition: AQS 提供了 Condition 对象,用于在等待队列上等待或唤醒线程。
-
AQS 的特点:
- 可扩展性: AQS 提供了一种灵活的机制,允许开发者实现各种同步工具。
- 公平性: AQS 支持公平性,即按照等待时间的顺序来获取同步状态。
- 可中断性: AQS 提供了中断机制,允许等待线程在等待过程中被中断。