Java 并发
AbstractQueuedSynchronizer(AQS)
技术参考:https://tech.meituan.com/2019/12/05/aqs-theory-and-apply.html
Java 并发包(java.util.concurrent
)中的一个核心类,位于 java.util.concurrent.locks
包中。它是构建锁和同步器的基础框架,提供了一个通用的机制来实现线程同步。AQS 的设计非常灵活,许多常用的同步工具(如 ReentrantLock
、Semaphore
、CountDownLatch
、CyclicBarrier
等)都基于 AQS 实现。
AQS 的核心是一个基于 FIFO 队列的线程等待机制,它通过维护一个状态变量(state
)和等待队列(CLH 队列
)来管理线程的同步。其主要思想包括:
- 状态变量(
state
):- 用于表示同步状态,通常是一个
int
类型的变量。 - 子类可以根据需要定义状态的含义,例如:
- 在锁中,
state
表示锁的获取状态(0 表示未锁定,1 表示锁定)。 - 在信号量中,
state
表示可用的许可数量。
- 在锁中,
- 用于表示同步状态,通常是一个
- FIFO 等待队列:
- 当线程尝试获取锁或同步资源而失败时,AQS 会将线程加入到一个 FIFO 等待队列中,直到资源可用时再唤醒线程。
AQS 的使用场景
AQS 是一个通用的同步框架,以下是一些基于 AQS 实现的常用同步工具:
ReentrantLock
:- 独占模式,支持可重入锁。
Semaphore
:- 共享模式,控制并发访问的许可数量。
CountDownLatch
:- 共享模式,允许一个或多个线程等待其他线程完成。
CyclicBarrier
:- 基于 AQS,允许一组线程相互等待,直到达到一个共同的屏障点。
ReadWriteLock
:- 独占模式和共享模式的结合,允许多个线程同时读,或一个线程写。