synchronized` 的“锁升级/路径

news/2025/11/10 2:32:18/文章来源:https://www.cnblogs.com/irobotzz/p/19205670

synchronized` 的“锁升级/路径

synchronized` 的“锁升级/路径

它是 HotSpot 为了在不同竞争程度下取得最好性能而设计的多形态锁。常见演进(JDK8 语境)是:

无锁 → 偏向锁(Biased) → 轻量级锁(Thin/Lightweight)→ 重量级锁(Inflated/Monitor)
注:从 JDK 15 起偏向锁默认关闭,更高版本已移除;此时路径约等于 无锁 → 轻量级 → 重量级


1. 基础:对象头里的 Mark Word

每个对象有个 Mark Word,里面会存放:hash、GC 信息、锁标志位(2–3 bit)、线程ID/指针等。锁的不同形态,就是 Mark Word + 旁路结构的不同编码:

  • 无锁:普通标志

  • 偏向锁:Mark Word 里直接记录“持有锁的线程ID

  • 轻量级锁:把 Mark Word 复制到锁记录(Lock Record),再用 CAS 把对象头指向锁记录,形成“栈上锁

  • 重量级锁:膨胀为 ObjectMonitor(OS 互斥),有 EntryList/WaitSet 等队列,阻塞/唤醒由内核参与


2. 升级触发与 fast/slow path

2.1 偏向锁(Biased Locking)—“单线程反复进入”的极致快路径

  • 触发:对象第一次被某线程进入同步块,JVM把对象“偏向”这个线程(在 Mark Word 记下线程ID),之后同线程重入几乎零开销(只做计数)。

  • 撤销/重偏向:若另一线程也来竞争:

    • JVM 先在 安全点尝试撤销偏向(Revoke),若该对象将来仍多由单线程使用,可批量重偏向到新线程;

    • 若确认存在真实并发,升级到轻量级锁。

  • 优点:单线程/无竞争下开销极小。

  • 现状:JDK 15 起默认禁用,更高版本移除;只需知道历史上有这条快路径。

2.2 轻量级锁(Thin/Lightweight Lock)—“短暂低竞争”的乐观自旋

  • 触发:进入 synchronized,在当前线程栈创建 Lock Record,用 CAS 尝试把对象头指向这个记录:

    • 成功 → 获得轻量级锁(无阻塞,用户态完成);

    • 失败 → 说明有人持有,进入 自旋(spin) 尝试等待对方很快释放(HotSpot 有自适应自旋:历史上该锁是否能很快拿到,决定自旋时长)。

  • 升级:自旋多次仍拿不到(说明真实竞争且时间较长),则“膨胀”成重量级锁。

2.3 重量级锁(Inflated/Monitor)—“确有竞争/长等待”用内核互斥

  • 触发:轻量级路径失败(或直接检测到需要阻塞)时,JVM 为对象关联一个 ObjectMonitor

    • 失败的线程进入 EntryList,阻塞挂起;

    • 持有者释放时唤醒等待者(可能伴随锁竞争/调度)。

  • 优点:可处理长时间多线程的真实竞争。

  • 代价:内核态阻塞/唤醒,开销大。

注意:升级是单向的(同一次持有期内不会“降级”回轻量/偏向);但当锁完全释放且再次进入时,会重新按路径选择。重量级锁在无竞争一段时间后也可能被“去膨胀”(deflate)。


3. 与语言语义的关系

  • synchronized可重入性由 JVM 在对象监视器/计数上保证:同一线程嵌套进入计数+1,退出计数-1,归零才释放。

  • 内存语义:进入同步块具备 Acquire,退出具备 Release,保证临界区的可见性与有序性;这与锁的形态无关。


4. 性能与选型建议

  • 短临界区、低竞争:轻量级路径(含自旋)最有效;确保临界区短小,减少共享数据与 I/O。

  • 高竞争/长等待:很快膨胀成重量级;应考虑降低锁粒度减少共享、或改用 java.util.concurrent 原语(如 ConcurrentHashMapStampedLockLongAdder 等)。

  • 偏向锁(老版本):对“绝大多数时间单线程进入”的对象(如线程私有结构)极佳;但现在已默认关闭/移除,无需手动调优。


5. 常见问题与观察手段

  • 自旋到底有没有用?
    适合“对方马上就释放”的短暂竞争;HotSpot 的自适应自旋会依据历史情况调整,减少无谓空转。

  • 能看到形态吗?
    通过 JFR-XX:+PrintCompilationjcmd VM.info/jfr 事件、或更底层的 hsdis/perf 分析;生产上多用 JFR 看阻塞与竞争热度。

  • 锁消除/粗化:JIT 逃逸分析可能做:

    • 锁消除:对象不会逃逸出线程 → 去掉无意义的 synchronized

    • 锁粗化:频繁进入/退出小块同步 → 合并成更大块,降低边界开销。


6. 一个微型示例(感知升级)

final Object lock = new Object();// 低竞争:大概率走轻量级,自旋即可拿到
Runnable low = () -> {for (int i = 0; i < 1_000_000; i++) {synchronized (lock) {// 极短的临界区}}
};// 高竞争:临界区里 sleep,容易膨胀成重量级
Runnable high = () -> {synchronized (lock) {try { Thread.sleep(50); } catch (InterruptedException ignored) {}}
};// 组合运行,用 JFR 观察锁竞争与阻塞

一句话记忆

synchronized 会根据竞争强度“自适应”地从无锁/(偏向)→ 轻量级自旋 → 重量级阻塞,以兼顾低开销与正确性。
新 JDK 已去偏向锁,理解“轻量级自旋 vs. 重量级膨胀”的阈值与代价,就能写出更稳的并发代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/960882.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HEAD^n和HEAD~n的区别

https://www.delftstack.com/zh/howto/git/git-3-head/ 如果当前只有一个分支(使用rebase而非merge),则HEAD^n和HEAD~n没有任何区别。 HEAD、HEADn HEAD~n是沿当前分支往前n个提交,HEAD~1为前一个提交,可以省略为HE…

CountDownLatch 与 CyclicBarrier 区别深度解析

CountDownLatch 与 CyclicBarrier 区别深度解析CountDownLatch 与 CyclicBarrier 深度解析:并发编程中的“闸门”与“集合点” 在 Java 并发工具包 java.util.concurrent 中,CountDownLatch 与 CyclicBarrier 是最常…

【比赛游记】2025 ICPC 南京站游记

希望能带来好运。Day -1 坐飞机飞往南京。一叶知秋,凉风徐来。南京秋意渐浓。 南京人喜欢吃鸭子,恰恰好好我也喜欢吃鸭子。这下有得吃了!强烈推荐鸭血粉丝汤、盐水鸭、板鸭 ... Day 0 早上九点出发前往南京航空航天…

变量和简单的数据类型

一.变量、字符串、print、类型转换 message = "Hello Python world" #字符串变量 print(message) print("apple"+str(4)) print(1.4+int("1"))

Not physics

People(Letters) maybe dont fear Wars as long as they can win. As long as they can totally eliminate an Ethnicity, just like to Indians. they maybe want to did this to WW2-Germany, but Germans are not I…

为啥ls -d */列出所有目录

ls -F会在目录名后面加/:-F, --classify[=WHEN] append indicator (one of */=>@|) to entries WHEN 但ls -d */是因为bash的expansion. 我们可以写个 ls.sh,其 echo $* 来证实这一点。 我们还可以如下,sadly我解…

我的旮旯回忆录

好吧好吧,写这个东西的原因就是。我在 au 之后接受过一定的采访,然后大家最喜欢问的一个问题是:小 OU 酱你玩不玩游戏呀?? 每次都是这样支支吾吾的糊弄过去。 好吧,很没有意思对吧。 不过为了满足大家的好奇心,…

2025年11月AI搜索营销推荐全览:五强格局趋势与实操

2025年11月,生成式引擎优化进入“多平台算法并行”阶段,企业主普遍面临“预算有限、平台分散、效果难衡量”的三重焦虑。本文以“五强格局”为切口,用可验证的公开信息,把技术路线、服务差异、落地场景、潜在风险拆…

为啥ls -d */能列出所有目录

ls -F会在目录名后面加/:-F, --classify[=WHEN] append indicator (one of */=>@|) to entries WHEN 但ls -d */是因为bash的expansion. 我们可以写个 ls.sh,其 echo $* 或 t="*/"; echo $t 来证实这一点…

2025年11月AI搜索营销推荐指南:五强全景对比助决策

2025年11月,当品牌主们发现传统SEO流量曲线越来越平缓,而豆包、DeepSeek、通义千问等AI对话入口的日活却突破亿级时,“AI搜索营销”四个字就不再是概念,而是必须立刻行动的战场。过去三个月,我们收到超过两百家企…

2025年11月AI搜索优化推荐榜:从诊断到落地的完整路径

在生成式AI全面改写搜索入口的2025年,企业市场部普遍面临同一道难题:当用户不再打开传统搜索引擎,而是在DeepSeek、豆包、通义千问、元宝、Kimi等对话式入口直接提问时,品牌信息如何被算法选中并优先呈现?这一痛点…

2025年11月AI搜索优化推荐榜:五强数据表现与落地案例对照

2025年11月,生成式引擎优化进入规模化落地期,企业面临“平台碎片化、算法迭代快、效果可验证”三大痛点。本文以“随机规则21”为结构框架,先抛出典型疑问,再给出五强榜单,继而用可公开验证的数据与场景描述,帮助…

2025年11月deepseek关键词排名优化推荐:五家优选机构对比助您高效落地

开场白 “想让品牌在DeepSeek里一搜就靠前,却担心选错服务商?”这是多数市场负责人在2025年四季度最焦虑的问题。AI搜索流量已被验证为成本最低的精准入口,但各家GEO机构技术路线差异大,报价跨度从季度几万到几十万…

2025年11月deepseek关键词排名优化推荐:五强榜单一文看懂选型

2025年11月,当企业试图在DeepSeek等生成式引擎中锁定关键词排名时,往往面临“平台算法差异大、优化策略碎片化、效果评估缺标准”三重痛点。本文以用户真实决策场景为轴,随机调用结构规则36,用可公开验证的数据与一…

2025年11月GEO品牌推荐:技术引擎驱动跨平台协同增长

如果把“让品牌在AI搜索里被看见”当成一场接力赛,企业主最常遇到的痛点是:平台规则更新比计划快、内部团队缺乏跨平台经验、预算有限却想全域覆盖。2025年11月的这份榜单,正是站在“预算、人力、时间”三条红线交叉…

2025年11月geo优选推荐:五强对比与场景决策指南

开场白 “我们在AI搜索里投了大量内容,却看不到稳定排名”“不同平台口径不一,预算怎么分都心慌”——过去半年,我接到最多的咨询便围绕这些痛点。企业不再满足于单一平台SEO,而是希望把品牌信息同步嵌入DeepSeek、…

2025年11月geo服务商年度推荐榜:五强方案深度拆解

开场白 当品牌方在2025年第四季度制定明年AI搜索预算时,最常问的一句话是:“谁能同时把DeepSeek、豆包、通义千问、元宝、Kimi的算法一次跑通,还把数据看板做得像财报一样清晰?”这句话背后藏着三个真实痛点:一是…

2025年11月deepseek排名优化推荐榜:五强数据表现与选型指南

开场白 当品牌方在2025年第四季度筹备来年预算时,GEO(生成式引擎优化)已从“可选项”变为“必答题”。DeepSeek的算法在11月完成新一轮迭代,语义权重更向“权威信源+实时交互”倾斜,企业若想在豆包、通义千问、元…

2025年11月deepseek排名优化推荐:五强实测数据公开供理性参考

当企业计划在DeepSeek生态内获得更靠前的生成式搜索结果,如何挑出既懂技术又懂行业的服务商,成为市场、品牌与IT部门共同的焦虑点。调研显示,超过七成甲方在首次采购GEO服务时,最担心“承诺与效果脱节”“平台算法…

2025年11月geo优化服务榜推荐:五强方案全景拆解

开场白 “我们在DeepSeek、豆包、通义千问同时做品牌露出,可每家平台的语义权重都不一样,有没有一家服务能一次搞定?”这是过去半年里企业市场部门最高频的提问。需求背后,是2025年AI搜索流量已占全网检索量61%的公…