ReentrantLock 的“自旋”和 JVM 的“自旋锁”不是一回事
JVM 自旋:OS / CPU 层面的短期忙等
ReentrantLock:AQS 层面的 CAS + park/unpark 策略
1️⃣ JVM 层面的自旋锁(HotSpot)
它自旋的是什么?
对象监视器(monitor)
本质是:synchronized 的轻量级锁阶段自旋策略特点
自旋次数 有限(10 次左右,动态调整)
完全在 用户态 + CPU 层面
不涉及线程阻塞,不进内核
目的只有一个 ———— 避免线程切换的系统调用开销JVM 自旋失败后会发生什么?
轻量级锁 → 自旋失败 → 重量级锁 → OS mutex → 阻塞
2️⃣ ReentrantLock 的“自旋”到底是什么?
⚠️ 严格说:ReentrantLock 没有纯自旋锁
它的核心是 AQS(AbstractQueuedSynchronizer)
获取锁的真实流程(简化)
CAS 尝试获取锁
↓
失败 → 入 AQS 队列
↓
park() 挂起线程
↓
unpark() 唤醒
那 CAS 算不算自旋?
只是在入队前做一次或极少量 CAS
不是持续 busy-wait
不会一直占 CPU
👉 所以:
ReentrantLock 的“自旋”是一次性 CAS 尝试
不是 JVM 那种循环忙等
3️⃣ ReentrantLock 有没有“自旋优化”?
有,但和 JVM 不是一个层级。
AQS 的自旋行为主要体现在:
① 公平锁 vs 非公平锁
非公平锁:
先 CAS 抢锁(插队)
成功就直接拿
公平锁:
必须排队,不抢
👉 非公平锁本质是降低上下文切换概率
② 队列头节点的有限自旋
当线程是 队头节点 时:
会做有限次数 CAS 尝试
成功则不 park
⚠️ 但这依然不是JVM那种while自旋