发布于2026-07-07 阅读(0)
扫一扫,手机访问
轻量级锁通过CAS抢锁并自旋等待,失败后升级为重量级锁;它在用户态完成同步,避免内核态切换开销,适用于短临界区、低频竞争场景。

Java 里的轻量级锁,说到底就是靠CAS这套原子指令来完成线程同步。它的核心思路很简单:遇到竞争先别急着挂起线程,让它在用户态自旋一会儿,实在不行再走阻塞那条路——目的就是把昂贵的用户态↔内核态切换压到最少。不是要彻底消灭竞争,而是让那些短时、低频的争夺在用户态快速消化掉,吞吐量自然就上来了。
那具体怎么通过CAS抢锁呢?当线程进入 synchronized 同步块的那一刻,JVM 先瞄一眼对象头的标志位:如果显示是“无锁”(标志位 01),就在当前线程的栈帧里建一个锁记录(Lock Record),然后用 CAS 指令尝试把对象头的 Mark Word 替换成指向这个锁记录的指针。
为什么自旋比挂起更高效?这里有个量级上的差异。线程挂起需要操作系统从用户态切到内核态,保存寄存器、刷新 TLB、触发调度器,一次切换少说几百纳秒到微秒级。而 CAS 自旋不过是 CPU 在用户态反复执行一条原子指令(比如 cmpxchg),成本极低。自旋期间线程保持运行态,完全避免了上下文切换的损耗。这特别适合锁持有时间很短(几十纳秒级别)、竞争不激烈但偶尔会碰到的情景。当然,如果自旋超过某个阈值(默认大概是 10 次)还是没抢到,那就升级成重量级锁,真正把线程挂起来。
单靠自旋远远不够,JVM 还为轻量级锁做了几层协同优化:
当然,CAS 和轻量级锁也不是万能的。它们有很明确的适用边界:
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8