AbstractQueuedSynchronizer(简称 AQS)是 Java 并发包(java.util.concurrent)中最核心的基础类之一,几乎所有自定义的同步器(如ReentrantLock、CountDownLatch、Semaphore、FutureTask等)都直接或间接地基于 AQS 实现。本文将深入探讨 AQS 的核心设计思想、内部数据结构、关键方法实现、以及它背后的并发控制模型。
🧠 一、AQS 的核心设计思想
AQS 提供了一个 队列式的、基于状态的同步框架,它的设计思想非常明确:
🌟 基本模型:
通过维护一个 volatile 的 state 变量来表示同步状态,并用一个 FIFO 队列管理等待线程。
具体来说,它实现了两种锁的语义:
- 独占(Exclusive):只能一个线程获取,比如
ReentrantLock。 - 共享(Shared):多个线程可以同时获取,比如
Semaphore。
开发者通过继承 AQS 并重写其 tryAcquire / tryRelease 等方法来实现自定义的同步逻辑,而不需要关心线程挂起/唤醒的底层细节。
🏗️ 二、AQS 的关键内部结构
1. state 变量(同步状态)
private volatile int state;
这是 AQS 的核心状态变量,通常用来表示资源是否可用、计数器大小等。子类通过 getState() / setState() / compareAndSetState() 来访问和修改它。
2. CLH 队列(等待队列)
AQS 使用一种变种的 CLH(Craig, Landin, and Hagersten)锁队列 来维护所有正在等待获取锁的线程。
static final class Node {
volatile Node prev;
volatile Node next;
volatile Thread thread;
volatile int waitStatus;
}
常见的 waitStatus 值:
0:默认状态SIGNAL (-1):后继节点等待唤醒CANCELLED (1):线程取消等待CONDITION (-2):表示在 condition 上等待PROPAGATE (-3):共享模式传播
队列头尾指针:

最低0.47元/天 解锁文章
170万+

被折叠的 条评论
为什么被折叠?



