21 reentrantlock的自旋策略跟jvm一样吗?

vvEcho 2026-01-27 18:06:07
Categories: Tags:

ReentrantLock 的“自旋”和 JVM 的“自旋锁”不是一回事
JVM 自旋:OS / CPU 层面的短期忙等
ReentrantLock:AQS 层面的 CAS + park/unpark 策略

1️⃣ JVM 层面的自旋锁(HotSpot)

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自旋