ReentrantLock的锁释放顺序不决定调度顺序,真正起作用的是锁的公平性:公平锁严格按等待队列FIFO唤醒;非公平锁允许新线程插队抢占,释放仅是竞争机会窗口。
ReentrantLock 的锁释放顺序本身不直接决定任务调度顺序,真正起作用的是锁的类型(公平 or 非公平)以及线程获取锁时的策略。释放锁只是触发“谁该下一个获得锁”的判断时机,而这个判断逻辑由锁实例的公平性决定,不是由释放动作的先后或顺序控制的。
公平锁在调用 unlock() 时,会从 AQS 同步队列头部取出最早等待的线程(FIFO),并让它尝试获取锁。这意味着:
非公平锁的 unlock() 只是唤醒等待队列中的一个线程(通常是头节点),但与此同时,任何新调用 lock() 的线程都会直接尝试 CAS 抢占锁——不管队列里有没有人等着。所以:
多个线程依次调用 unlock(),并不会形成某种“释放队列”来影响后续调度。JVM 线程调度器不感知 unlock 调用顺序,AQS 也不记录“谁先释放”。关键区别只在两点:
立即学习“Java免费学习笔记(深入)”;
有人误以为“先 unlock 的线程,后续就更容易拿到锁”,这是不成立的。例如:
不复杂但容易忽略:锁释放只是门开了,谁进门,得看门上贴的是“排队入场”还是“先到先撞门”。