发布于2026-07-08 阅读(0)
扫一扫,手机访问
ReentrantLock的锁释放顺序不决定调度顺序,真正起作用的是锁的公平性:公平锁严格按等待队列FIFO唤醒;非公平锁允许新线程插队抢占,释放仅是竞争机会窗口。

很多人在接触并发编程时,都有一个下意识的假设:先释放锁的线程,下次就更容易拿到锁。但现实远比想象中复杂——锁释放的顺序本身根本不会决定“谁下一个上场”,真正拍板的,是锁的类型和它的抢锁策略。释放锁这个动作,只是给系统一个信号:“机会窗口开了”,至于轮到谁,得看这把锁是“讲规矩”还是“拼手速”。
公平锁在调用 unlock() 时,会从 AQS 同步队列头部取出最早等待的线程(FIFO),并让它尝试获取锁。这意味着:
可以这么理解:公平锁就像电影院门口排好的队伍,你出去上个厕所再回来,不好意思,得重新排到队尾。
非公平锁的 unlock() 只是唤醒等待队列中的一个线程(通常是头节点),但与此同时,任何新调用 lock() 的线程都会直接尝试 CAS 抢占锁——完全不管队列里有没有人等着。所以:
多个线程依次调用 unlock(),并不会形成某种“释放队列”来影响后续调度。JVM 线程调度器根本不感知 unlock 的调用顺序,AQS 也不记录“谁先释放”。关键区别只有两点:
所以,不要天真地以为“我早点释放锁,后面就能占便宜”。时机和模式才是真正的裁判。
有人误以为“先 unlock 的线程,后续就更容易拿到锁”,这其实是一种错觉。来看几个例子:
不复杂但容易忽略:锁释放只是门开了,谁进门,得看门上贴的是“排队入场”还是“先到先撞门”。理解这一点,才能在实际调优时避免踩坑。
上一篇:git下实现快速提交及推送
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8