一、核心知识点详细解释
1.1 AQS 概述
AQS(AbstractQueuedSynchronizer)是 Java 并发包 java.util.concurrent
中的一个抽象类,它是构建锁和其他同步组件的基础框架。许多并发工具如 ReentrantLock
、CountDownLatch
、Semaphore
等都是基于 AQS 实现的。AQS 提供了一个 FIFO(先进先出)的队列来管理线程,通过一个 int
类型的状态变量 state
来表示同步状态,线程可以通过修改这个状态变量来获取或释放锁。
1.2 AQS 的核心数据结构
1.2.1 同步状态 state
state
是 AQS 中的一个 volatile
修饰的 int
类型变量,用于表示同步状态。不同的同步组件可以根据 state
的值来实现不同的同步逻辑。例如,在 ReentrantLock
中,state
表示锁的重入次数,当 state
为 0 时表示锁未被持有,大于 0 时表示锁已被持有且重入了相应的次数。
1.2.2 队列
AQS 内部维护了一个 FIFO 的双向队列,用于管理等待获取锁的线程。队列中的每个节点(Node
)代表一个等待的线程,节点包含了线程的引用、等待状态等信息。
1.3 AQS 的核心方法
1.3.1 acquire(int arg)
该方法用于获取锁,是一个模板方法,其实现如下:
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
tryAcquire(arg)
:尝试获取锁,这是一个需要子类实现的方法,用于自定义获取锁的逻辑。addWaiter(Node.EXCLUSIVE)
:将当前线程封装成一个节点并加入到等待队列的尾部。acquireQueued(node, arg)
:使节点在队列中等待获取锁,如果在等待过程中被中断,则返回