ReentrantLock的实现原理

17 阅读1分钟

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. 公平 / 非公平锁的差异

  • 公平锁:严格按等待队列的 “先后顺序” 抢锁;
  • 非公平锁:未排队的线程可以直接尝试抢锁(不遵守队列顺序)。