You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Lightweight Lock升级为Heavyweight Lock时是否会触发Stop The World?

结论

轻量级锁升级为重量级锁的过程不会触发 Stop The World (STW),这一点和偏向锁升级到轻量级锁的逻辑有本质区别。

底层原因说明

  • 首先明确两种锁升级的前提差异
    偏向锁的设计前提是「锁几乎不会出现多线程竞争,只会被固定线程持有」,因此对象头的Mark Word会直接记录持有偏向锁的线程ID。当第二个线程尝试竞争锁时,JVM需要先校验原持有偏向锁的线程是否还存活、是否还在持有该锁,为了避免校验过程中线程状态发生变化,必须触发STW完成偏向锁撤销,之后才能升级为轻量级锁。
  • 轻量级锁本身就是为多线程交替竞争场景设计的
    轻量级锁加锁时,尝试拿锁的线程会先在自身栈帧中创建名为Lock Record的结构,再通过CAS操作尝试把对象头的Mark Word替换为指向自己栈帧中Lock Record的指针,CAS成功就算拿到轻量级锁。
    当多个线程同时竞争轻量级锁、多次CAS拿锁失败时,JVM就会启动升级到重量级锁的逻辑,整个过程不需要STW:

    升级的核心操作是先在堆中创建重量级锁的实现结构ObjectMonitor,再通过CAS尝试把对象头的Mark Word替换为指向这个ObjectMonitor的指针,只要CAS成功,锁的状态就切换为重量级锁,后续所有竞争锁的线程都会直接走重量级锁的阻塞、唤醒逻辑,全程不需要暂停其他用户线程。

  • 额外澄清一个容易混淆的点
    升级到重量级锁之后,竞争失败的线程会被操作系统内核态阻塞,这是操作系统层面的线程调度行为,不是JVM发起的STW,不会影响其他没有竞争当前锁的线程正常运行。

内容的提问来源于stack exchange,提问作者YuChan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:45:02