1. ReentrantLock与AQS的设计哲学
在Java并发编程领域,ReentrantLock和AQS(AbstractQueuedSynchronizer)的关系就像智能手机与操作系统。ReentrantLock是开发者直接使用的应用层API,而AQS则是支撑其运行的底层框架。这种分层设计体现了Java并发包(JUC)的核心思想:将通用的同步机制抽象出来,让具体实现可以灵活扩展。
重要提示:理解AQS是掌握Java并发编程的关键,它不仅是ReentrantLock的基础,也是CountDownLatch、Semaphore等同步工具的共同实现基础。
AQS框架主要解决三个核心问题:
- 状态管理:通过volatile int state字段表示资源状态
2.线程排队:通过CLH队列变体管理等待线程 - 阻塞/唤醒:通过LockSupport实现线程的精确控制
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AQS核心机制深度解析
2.1 状态管理:volatile state的艺术
state字段是AQS的灵魂,它通过volatile修饰保证可见性,同时所有状态变更都必须通过CAS操作保证原子性。在ReentrantLock中,state的语义是:
- 0:锁未被任何线程持有
- 1:锁被独占持有
-
1:锁被重入持有(数值表示重入次数)
java复制// AQS中的关键状态字段
private volatile int state;
protected final int getState() {
return state;
}
protected final void setState(int newState) {
state = newState;
}
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
2.2 CLH队列变体:线程排队的实现
AQS使用的队列是CLH锁的变体,主要改进包括:
- 显式的prev/next指针:便于取消和超时处理
- 虚拟头节点:简化边
