ReentrantLock公平锁实现与可重入特性

一、文章概述

ReentrantLock是JUC并发包下基于AQS实现的独占锁,支持可重入,并提供公平锁、非公平锁两种模式。本文讲解可重入实现原理,明确公平锁获取失败后的入队规则,清晰对比两种锁的核心差异。

二、核心特性

特性 说明
可重入性 同一线程可多次获取锁,通过state计数实现
公平锁 严格遵循队列顺序,无抢占、无重试
非公平锁 支持直接抢占锁,性能更高

三、可重入性实现原理

依托AQS的state变量实现可重入:

  1. 线程重入锁,state +1
  2. 释放锁,state -1
  3. state=0 代表锁完全释放

四、公平锁获取流程

成功

失败

线程尝试获取锁

队列有等待线程?

加入队列队尾阻塞

CAS修改state

获取锁

被前驱唤醒

五、非公平锁获取流程

成功

失败

线程尝试获取锁

直接CAS抢占锁

获取锁执行代码

加入队列队尾阻塞

被唤醒

六、核心规则

  1. 公平锁:CAS获取失败后,不重试、不插队,直接加入AQS队列队尾,严格遵守FIFO先来先服务
  2. 非公平锁:CAS抢占失败后,同样加入队列队尾,但获取锁时允许直接抢占

总结

ReentrantLock通过state实现可重入;公平锁与非公平锁获取失败后,统一加入AQS队列队尾。公平锁全程禁止插队,保证执行顺序;非公平锁允许抢占,提升吞吐量,可按需选择。

更多推荐