首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >大聪明助你拿Offer | Sychronized 锁升级过程是什么?

大聪明助你拿Offer | Sychronized 锁升级过程是什么?

作者头像
不肯过江东丶
发布2026-06-17 21:25:33
发布2026-06-17 21:25:33
320
举报

Sychronized 锁升级过程是什么?

前言

“面试造火箭,入职拧螺丝?” 别慌!这里没有“茴香豆的茴有几种写法”,只有最实用、最高频、最能唬住面试官的 Java 面试题解析!

正文

每日一题:Sychronized 锁升级过程是什么?

难度系数: ⭐⭐

在synchronized 是 Java 提供的内置锁(Monitor Lock),用于保证多线程环境下的同步访问。在说 synchronized 锁的升级过程之前,我们先来简单了解一下 synchronized 的实现原理 👇

JVM 通过 monitorenter 和 monitorexit 字节码指令实现锁的获取和释放:

  • monitorenter:尝试获取锁(进入 Monitor)
  • monitorexit:释放锁(退出 Monitor)

锁信息存储在对象头中的 Mark Word:

  • 32 位 JVM:Mark Word 占 32 bits
  • 64 位 JVM:Mark Word 占 64 bits

对象头(Mark Word)存储了锁状态信息,不同锁状态下其结构也有所不同:

ScreenShot_2026-01-21_171043_888.png
ScreenShot_2026-01-21_171043_888.png

Java 6 之后,synchronized 采用锁升级(Lock Escalation)机制,从 无锁 → 偏向锁 → 轻量级锁 → 重量级锁 逐步升级,以减少锁竞争带来的性能开销。

1、无锁(Unlocked)

  • 初始状态,对象刚创建时没有线程竞争。
  • Mark Word 存储 hashCode + 分代年龄 + 锁标志位 01。

2、偏向锁(Biased Locking)

  • 适用场景:只有一个线程访问同步代码块。
  • 实现方式:JVM 在 Mark Word 中记录 线程 ID,表示该线程持有偏向锁。后续该线程进入同步代码块时,无需 CAS 操作,直接检查 Mark Word 中的线程 ID 是否匹配。
  • 优点:减少 CAS 操作,提高单线程访问性能。
  • 撤销偏向锁:如果另一个线程尝试获取锁,JVM 会撤销偏向锁,升级为轻量级锁。

3、轻量级锁(Lightweight Locking)

  • 适用场景:多个线程 交替执行(无竞争或竞争不激烈)。
  • 实现方式:JVM 在当前线程的栈帧中创建 锁记录(Lock Record),并拷贝 Mark Word 到锁记录。使用 CAS 尝试将 Mark Word 替换为指向锁记录的指针。如果 CAS 成功,当前线程获取轻量级锁;如果 CAS 失败(竞争发生),则升级为 重量级锁。
  • 优点:避免直接进入重量级锁,减少线程阻塞。

4、重量级锁(Heavyweight Locking)

  • 适用场景:多个线程 竞争激烈(长时间等待锁)。
  • 实现方式:JVM 分配一个 Monitor 对象(ObjectMonitor),Mark Word 指向该 Monitor。未获取锁的线程进入 阻塞队列(EntryList),等待唤醒。
  • 缺点:涉及 用户态 → 内核态切换,性能较低。

小结

4

📢 面试不是终点,而是技术成长的起点!持续关注本专栏,更多硬核内容在路上!

如果觉得有用,别忘了点赞+关注,你的支持是我更新的最大动力❤️

END

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大聪明教你学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档