1. 底层依赖
ReentrantLock的非公平锁(NonfairSync)是基于 AQS(AbstractQueuedSynchronizer) 实现的。
2. 核心状态与结构
NonfairSync(AQS 子类)包含 4 个关键属性:
state:锁的状态(state=1表示锁已被持有);head/tail:指向 CLH 双向等待队列的头、尾节点;exclusiveOwnerThread:记录当前持有锁的线程(图中为Thread-0);- 等待队列:由
Node节点组成,节点存储等待线程(如Thread-1/Thread-2/Thread-3)。
3. 加锁流程
线程抢锁时:
- 尝试用CAS 方式修改
state:若成功将state改为 1,同时把exclusiveOwnerThread指向当前线程 → 加锁成功; - 若 CAS 修改
state失败(锁已被持有)→ 当前线程被封装为Node,加入双向等待队列(head指向队列头,tail指向队列尾)。
4. 解锁流程
当exclusiveOwnerThread被置为null(锁完全释放)时,会唤醒等待队列中的线程,让其尝试抢锁。
5. 公平 / 非公平锁的差异
- 公平锁:严格按等待队列的 “先后顺序” 抢锁;
- 非公平锁:未排队的线程可以直接尝试抢锁(不遵守队列顺序)。