1. AQS核心机制解析
AbstractQueuedSynchronizer(AQS)作为Java并发包的基石,其设计精髓在于通过CLH队列变体管理线程阻塞与唤醒。理解AQS需要把握三个关键维度:
-
状态管理:volatile修饰的state变量是同步器的核心,通过CAS操作实现原子性更新。在ReentrantLock中state表示重入次数,Semaphore中表示许可数量,CountDownLatch中表示剩余计数。
-
队列管理:采用双向链表实现的CLH队列,节点类型分为:
java复制static final class Node { // 共享模式标记 static final Node SHARED = new Node(); // 独占模式标记 static final Node EXCLUSIVE = null; // 等待状态值 volatile int waitStatus; volatile Node prev, next; volatile Thread thread; Node nextWaiter; } -
模板方法:tryAcquire/tryRelease等protected方法需子类实现,AQS负责队列调度和线程阻塞/唤醒的通用逻辑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 独占模式实现原理
2.1 锁获取流程
以ReentrantLock为例,lock()调用链路:
code复制ReentrantLock.lock()
-> Sync.lock()
-> AQS.acquire(1)
-> tryAcquire()尝试获取锁
-> addWaiter()加入队列
-> acquireQueued()自旋获取
关键方法acquireQueued包含三个核心步骤:
- 前置检查:只有前驱节点是头节点时才尝试获取锁,保证FIFO顺序
- 阻塞控制:通过shouldParkAfterFailedAcquire清理取消节点并设置SIGNAL状态
- 中断处理:使用Thread.interrupted()检查中断状态,避免丢失中断信号
