目录一、基础铺垫ReentrantLock 的核心结构二、非公平锁NonfairSync底层实现1. 加锁核心流程2. 非公平锁关键特性三、公平锁FairSync底层实现1. 加锁核心流程2. 公平锁关键特性四、释放锁逻辑公平 / 非公平完全一致五、核心区别总结底层实现总结ReentrantLock是 Java 中基于 AQSAbstractQueuedSynchronizer抽象队列同步器实现的可重入锁公平锁和非公平锁的核心区别线程获取锁的顺序是否严格遵循等待队列的 FIFO先进先出规则。先明确核心结论非公平锁新线程来抢锁时先直接尝试插队抢占锁抢不到再进入等待队列排队公平锁绝对禁止插队新线程来抢锁时先检查队列里有没有其他线程在等待有就直接排队不尝试抢占。一、基础铺垫ReentrantLock 的核心结构ReentrantLock内部定义了Sync抽象类继承 AQS公平锁FairSync、非公平锁NonfairSync都继承自 SyncAQS 核心组件stateint 变量0无锁0持有锁重入次数exclusiveOwnerThread记录当前持有锁的线程CLH 等待队列双向链表存储抢不到锁的等待线程。可重入特性同一个线程多次获取锁时state累加释放锁时递减直到state0才真正释放锁。二、非公平锁NonfairSync底层实现核心设计先插队失败再排队追求更高吞吐量默认锁。1. 加锁核心流程// 非公平锁lock()方法 final void lock() { // 第一步直接插队CAS尝试将state从0改为1抢占锁 if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); // 抢占成功设置持有线程 else acquire(1); // 抢占失败走标准AQS获取锁逻辑 } // AQS的acquire方法非公平/公平锁通用骨架 public final void acquire(int arg) { // 1. 再次尝试获取锁 2. 获取失败则入队等待 if (!tryAcquire(arg) acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt(); } // 非公平锁的tryAcquire重写AQS方法 protected final boolean tryAcquire(int acquires) { return nonfairTryAcquire(acquires); } // 非公平锁核心获取逻辑 final boolean nonfairTryAcquire(int acquires) { final Thread current Thread.currentThread(); int c getState(); if (c 0) { // 锁空闲 // 再次插队CAS抢锁不检查队列 if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } // 可重入当前线程已持有锁state1 else if (current getExclusiveOwnerThread()) { int nextc c acquires; setState(nextc); return true; } return false; // 抢锁失败 }2. 非公平锁关键特性两次插队机会第一次lock()直接 CAS 抢锁第二次tryAcquire()发现锁空闲再次 CAS 抢锁不检查等待队列只要锁空闲新线程可以直接抢走不管队列里有没有等待很久的线程优点减少线程上下文切换吞吐量高缺点可能导致队列线程 饥饿长时间抢不到锁。三、公平锁FairSync底层实现核心设计不插队先检查队列排队获取锁保证严格的先来先服务。1. 加锁核心流程// 公平锁lock()方法直接走acquire没有插队CAS final void lock() { acquire(1); } // 公平锁的tryAcquire重写AQS方法 protected final boolean tryAcquire(int acquires) { final Thread current Thread.currentThread(); int c getState(); if (c 0) { // 核心区别先检查队列hasQueuedPredecessors()队列有等待线程 if (!hasQueuedPredecessors() // 队列空才允许抢锁 compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } // 可重入逻辑和非公平锁完全一致 else if (current getExclusiveOwnerThread()) { int nextc c acquires; setState(nextc); return true; } return false; }2. 公平锁关键特性禁止任何插队lock()直接走标准流程没有 CAS 抢占强制检查队列hasQueuedPredecessors()是核心判断如果队列里有其他线程在等待 → 新线程直接入队不抢锁只有队列为空 / 自己是队首线程 → 才允许抢锁优点无线程饥饿严格公平缺点频繁上下文切换吞吐量低于非公平锁。四、释放锁逻辑公平 / 非公平完全一致释放锁没有公平性区别核心都是state递减state0时释放持有线程唤醒队列中的下一个等待线程。public void unlock() { sync.release(1); } public final boolean release(int arg) { if (tryRelease(arg)) { Node h head; if (h ! null h.waitStatus ! 0) unparkSuccessor(h); // 唤醒队列下一个线程 return true; } return false; } // 释放锁state-1为0时释放锁 protected final boolean tryRelease(int releases) { int c getState() - releases; if (Thread.currentThread() ! getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free false; if (c 0) { free true; setExclusiveOwnerThread(null); } setState(c); return free; }五、核心区别总结底层实现对比维度非公平锁NonfairSync公平锁FairSync抢锁入口lock()先 CAS 插队抢锁直接走acquire()不插队锁空闲时不检查队列直接 CAS 抢锁必须先检查hasQueuedPredecessors()等待队列新线程可能跳过队列严格遵守 FIFO 队列顺序线程饥饿可能出现不会出现吞吐量高低底层差异无队列检查多了hasQueuedPredecessors()判断总结底层基石公平 / 非公平锁都基于AQS实现核心差异在tryAcquire()抢锁逻辑非公平锁插队优先两次 CAS 抢锁不检查等待队列吞吐量更高公平锁排队优先强制检查队列绝对禁止插队无饥饿但性能更低通用特性可重入、锁释放逻辑、CLH 等待队列、AQS 的state状态管理完全一致。