一、核心知识点详细解释
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):使节点在队列中等待获取锁,如果在等待过程中被中断,则返回true。selfInterrupt()

最低0.47元/天 解锁文章
1465

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



