news 2026/9/28 19:39:13

轻量级锁失败后,到底会不会自旋?——一次被八股文带偏的复盘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
轻量级锁失败后,到底会不会自旋?——一次被八股文带偏的复盘

轻量级锁失败后,到底会不会自旋?——一次被八股文带偏的复盘

起因

前几天复习 Java 锁升级,看到一个问题:

轻量级锁获取失败后,会发生什么?

我脑子里立刻蹦出那句经典的八股文答案:

“轻量级锁会先自旋尝试获取锁,自旋失败后再升级为重量级锁。”

看起来没毛病,网上到处都是这个说法。但当我真正去翻 HotSpot 源码时,发现事情并不是这样。

源码里到底发生了什么

以 JDK 8 的 HotSpot 为例,轻量级锁的获取逻辑在fast_lock里,核心步骤非常干脆:

  1. CAS 尝试:把对象头的 Mark Word 替换成指向当前线程栈中 Lock Record 的指针。
  2. 成功:拿到锁,继续执行。
  3. 失败:直接调用ObjectSynchronizer::inflate,膨胀成重量级锁。

翻遍这条路径,没有任何自旋逻辑。CAS 一旦失败,就意味着“存在真实竞争”,JVM 不再做无谓的尝试,直接升级。

也就是说:

轻量级锁 CAS 失败 → 直接膨胀为重量级锁,中间没有自旋。

那“自旋”到底在哪?

自旋确实存在,但它属于重量级锁内部的优化,不是轻量级锁的步骤。

当锁已经膨胀成重量级锁(ObjectMonitor)后,线程尝试获取 monitor 时,如果发现锁被占用,ObjectMonitor 的入口逻辑会先让线程短暂自旋(TrySpin_VaryDuration,自适应自旋),希望能抢到刚刚被释放的锁,避免直接park进入内核态阻塞。自旋一段时间仍失败,才真正阻塞。

所以正确的划分是:

阶段行为
轻量级锁 CAS 失败直接膨胀为重量级锁,不自旋
重量级锁获取失败先自旋,失败再阻塞

八股文把这两件事揉在了一起,说成“轻量级锁自旋失败再升级”,顺序和归属都错了。

为什么会流传这个错误说法?

我复盘了一下,大概有几个原因:

  1. “自旋锁”这个概念太深入人心。JDK 1.6 之前自旋锁是一个独立的优化(-XX:+UseSpinning),很多人一提锁竞争就想到自旋,于是想当然地安到了轻量级锁头上。

  2. 描述上的偷懒。从线程视角看,“我抢锁失败了,等了一会儿,然后被阻塞”——这个“等了一会儿”很容易被笼统地说成自旋,而不去区分它发生在哪个阶段。

  3. 面试八股文的自我复制。一个说法被写进博客、被面试题收录、被更多人背诵,就慢慢变成了“标准答案”,很少有人回去核对源码。

一个补充:新版本 JDK 的变化

值得一提的是,在较新的 JDK(如 JDK 21 及以后)中,轻量级锁的实现有所调整。在LM_LIGHTWEIGHT模式下,CAS 遇到竞争时可能会先短暂自旋一下,目的是避免过早膨胀。但这是新架构下的性能微调,不能拿来解释经典实现(JDK 8 等)的行为。

所以如果你看的是 JDK 8 的源码,结论就是:失败即膨胀,不自旋。

教训

这件事给我最大的提醒是:

八股文和源码事实之间,经常有偏差。

八股文适合快速回忆框架,但一旦涉及“具体在哪一步、发生了什么”,就必须回到源码。尤其是并发这种细节极多的领域,一句笼统的“先自旋再升级”,可能就把两个不同阶段的机制混为一谈。

下次再看到类似的说法,我的第一反应应该是:

  • 这个行为发生在哪个阶段?
  • 属于哪把锁的机制?
  • 源码里真的有这一步吗?

而不是直接背下来。

总结

  • 轻量级锁 CAS 失败 →直接膨胀为重量级锁,不自旋。
  • 自旋发生在重量级锁的获取入口,是 ObjectMonitor 的优化。
  • 八股文“轻量级锁自旋失败再升级”的说法,混淆了阶段和归属。
  • 新版本 JDK 有调整,但经典实现(JDK 8)就是“失败即膨胀”。

本文是一次自我纠错的记录。如果你也在复习锁升级,希望它能帮你少走一点弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 19:38:45

车规SoC深度解析:从认证到选型,主流芯片全对比

1. 写在前面:为什么车规 SoC 比手机 SoC 难懂得多这几年智能汽车的火爆直接把一个原本偏冷门的词推到了大众面前——车规 SoC。我身边不少做消费电子的朋友刚转过来时都犯过一个同样的错误:拿手机 SoC 那套“看制程、看大核、看跑分”的思维去套车规芯片…

作者头像 李华
网站建设 2026/9/28 19:38:38

AI+:一文带你了解OpenAI Codex的进化史与TaoToken配置实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 19:38:08

树莓派工业级控制器BL460:从硬件选型到项目落地全解析

1. 先搞清楚:BL460 到底凭什么叫“工业级”1.1 它跟普通树莓派外壳的区别我看到 BL460 这个名字的时候,第一反应是“这会不会又是一个把树莓派塞进金属壳里的套壳方案”。实际深入了解之后发现,这类产品的定位比我想象中要严谨得多。它本质上…

作者头像 李华
网站建设 2026/9/28 19:38:00

能装在IDE上的AI代码工具有哪些?TaoToken统一Key接入配置清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/28 19:37:23

WeKnora 部署实战:构建企业级 RAG 知识库与匹配度调优

说实话,我第一次看到 WeKnora 这个项目名时,第一反应是“又一个 RAG 知识库”,毕竟现在这类开源项目太多了,Dify、FastGPT、MaxKB、RAGFlow 哪个不是在做同样的事。但仔细翻了下它的技术方案和项目背景,发现确实有值得…

作者头像 李华