Java面试——Synchronized底层实现原理-Java面试题

synchronized 方法能同步是因为编译器自动插入 monitorenter/monitorexit 指令,触发 ObjectMonitor 的获取与释放;ObjectMonitor 是 C++ 实现的结构体,含 _owner、_EntryList、_WaitSet 等字段,支持重入和等待队列;锁升级为偏向→轻量级→重量级,JDK 15+ 默认关闭偏向锁。

Java 中 synchronized 不是靠 JVM 解释执行的“语法糖”,而是直接绑定到操作系统级的互斥原语,底层依赖的是 monitorenter / monitorexit 字节码指令 + HotSpot 的 ObjectMonitor 机制。

为什么 synchronized 方法没有显式加锁却能同步?

因为编译器会把 synchronized 方法自动转换为在方法入口插入 monitorenter 指令、出口插入 monitorexit 指令。JVM 执行时,这两条指令会触发对当前对象(或 class 对象)关联的 ObjectMonitor 的获取与释放。

关键点:

  • ObjectMonitor 是 C++ 实现的,每个 Java 对象头(mark word)里存着指向它的指针(偏向锁被撤销后)
  • 非静态方法锁的是 this 对象;静态方法锁的是 Class 对象(即 MyClass.class)
  • 如果方法抛异常,JVM 仍会保证 monitorexit 执行 —— 这就是 synchronized 不需要手动 try-finally 的原因

锁升级过程:偏向锁 → 轻量级锁 → 重量级锁

HotSpot 默认开启锁优化,实际锁状态在对象头 mark word 中动态变化,不是固定一种实现:

立即学习“Java免费学习笔记(深入)”;

  • 偏向锁:假设无竞争,直接把线程 ID 记录在 mark word 中;后续同一线程重入无需 CAS
  • 轻量级锁:有竞争但不激烈时,用 CAS 尝试将对象头指向线程栈中的 Lock Record;失败则升级
  • 重量级锁:真正调用操作系统 mutex,挂起线程(pthread_mutex_lock),此时 mark word 存的是 ObjectMonitor* 地址

锁升级不可逆(但 JDK 10+ 引入了锁降级尝试,仅限 GC 阶段,生产环境基本不生效)。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Java面试——Synchronized底层实现原理-Java面试题
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4024478+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4024479+
  • 本周更新: 0+
  • 最后更新: 2026-03-16