跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava算法

Java synchronized 底层原理:从字节码到锁升级机制

synchronized 基于 JVM 的 Monitor 实现,通过 monitorenter 和 monitorexit 指令控制锁。对象头 Mark Word 记录锁状态,支持偏向、轻量级及重量级锁的单向升级。硬件层面依赖内存屏障保证可见性与有序性,CAS 保障原子性。理解其底层有助于优化并发性能。

安卓系统发布于 2026/3/15更新于 2026/4/273 浏览
Java synchronized 底层原理:从字节码到锁升级机制

synchronized 是 Java 中最基础的同步工具,理解它的底层实现对于掌握并发编程至关重要。我们通常只关注语法层面的使用,但深入 JVM 内部,会发现它是一套精妙的状态管理机制。

字节码层面:monitorenter 与 monitorexit

当你编写 synchronized 代码时,编译器会在字节码中生成对应的指令。无论是修饰方法还是代码块,核心都围绕着一对指令展开。

对于同步代码块 synchronized(obj) { ... },编译器会在同步区域前后分别插入 monitorenter 和 monitorexit。我们可以用 javap -v 反编译查看:

public void method();
Code:
   0: aload_0
   1: getfield      #2                  // Field obj:Lcom/example/Obj;
   4: dup
   5: astore_1
   6: monitorenter                        // 尝试获取锁
   ...
  16: monitorexit                         // 正常退出释放锁
  17: goto          25
  20: astore_2
  21: aload_1
  22: monitorexit                         // 异常退出也释放锁
  23: aload_2
  24: athrow
  25: return

这里有两个关键点值得注意:

  1. 双重 monitorexit:第一个用于正常流程结束,第二个隐藏在异常处理逻辑中(类似 finally)。这是为了确保即使同步块内抛出异常,锁也能被正确释放,避免死锁。
  2. 同步方法:如果是 synchronized 修饰的方法,常量池中会标记 ACC_SYNCHRONIZED。调用时虚拟机自动处理加锁解锁,无需显式指令,但原理一致。
JVM 底层:对象头与 Monitor

指令背后的执行者,是 JVM 的 Monitor(管程)和 对象头。在 HotSpot 中,每个对象都有对应的 Monitor,而锁的状态信息就存储在对象的 Mark Word 里。

对象头结构

对象头包含两部分:Klass Pointer(指向类元数据)和 Mark Word(存储运行时数据)。Mark Word 是非固定的动态数据结构,会根据对象状态复用空间。其中最后几位标识了锁状态,这也是锁升级的核心依据。

Monitor 的作用

Monitor 是 JVM 级别的互斥锁,由 C++ 实现。它维护了线程与锁的关系:

  • Owner:当前持有锁的线程,同一时刻只能有一个。
  • EntryList:等待进入同步块的线程队列(Blocked 状态)。
  • WaitSet:调用了 wait() 方法的线程队列(Waiting 状态)。

当线程执行 monitorenter 时,会检查 Owner。如果为空,直接获取;如果已被占用,则进入 EntryList 阻塞等待。这种机制保证了同一时刻只有一个线程能操作临界区。

锁的升级与优化

早期版本的 synchronized 直接依赖操作系统互斥锁(重量级),开销大。JDK 6 引入了锁升级机制,根据竞争情况动态调整锁的粒度,路径是单向的:无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。

偏向锁

适用于单线程反复访问的场景。第一次加锁时,将线程 ID 写入 Mark Word。后续该线程再次进入无需 CAS 操作,只需比对 ID。一旦有另一个线程竞争,偏向模式失效,升级为轻量级锁。

注:Java 15+ 已废弃偏向锁,默认禁用,但理解其原理仍有助于分析旧版本行为。

轻量级锁

适用于存在轻微竞争的场景。线程通过 CAS 将对象头复制到栈帧中的锁记录(Lock Record),并尝试替换对象头。成功则获得锁,失败则自旋等待。若自旋后仍无法获取,说明竞争激烈,将膨胀为重量级锁。

重量级锁

此时 Mark Word 指向 Monitor 对象。所有等待线程进入 EntryList 阻塞,依赖操作系统内核调度。虽然性能最低,但在高竞争下能保证公平性。

硬件层面:内存屏障与 CAS

synchronized 保证了原子性、可见性和有序性,这离不开硬件支持。

  • 可见性与有序性:通过内存屏障实现。同步块入口加 Load Barrier,出口加 Store Barrier,强制刷新工作内存到主存,禁止指令重排序。
  • 原子性:锁状态的变更(如轻量级锁的获取)依赖 CPU 提供的 CAS 指令(Compare-And-Swap),确保'比较 - 交换'操作的原子性。

理解这些细节,能帮助我们在实际开发中更合理地选择同步策略,避免不必要的性能损耗。

目录

  1. 字节码层面:monitorenter 与 monitorexit
  2. JVM 底层:对象头与 Monitor
  3. 对象头结构
  4. Monitor 的作用
  5. 锁的升级与优化
  6. 偏向锁
  7. 轻量级锁
  8. 重量级锁
  9. 硬件层面:内存屏障与 CAS
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 GLM-4.6V-Flash-WEB 构建智能阅卷系统实战
  • AI 绘画建筑设计提示词:从基础到高级的创作指南
  • Docker Desktop 磁盘优化:迁移 docker_data.vhdx 至非系统盘
  • OpenClaw 集成飞书机器人部署指南
  • Raphael AI:基于 Flux 模型的免费 AI 图像生成工具
  • 位运算核心原理与实战应用
  • VSCode 通义灵码插件安装配置与实战教程
  • ClawdBot 本地 AI 实践:树莓派 4 运行 OCR/Whisper/vLLM 高并发
  • AI 热榜深度解析:平台生态、多智能体与评测体系新趋势
  • VR + 具身智能 + 人形机器人:通往现实世界的智能接口
  • MiniMax-M2.1 模型开源发布与核心能力评测
  • 可扩展多任务视觉基础模型 LaVin-DiT:融合时空 VAE 与 DiT
  • Vue 3 计算属性详解:选项式与组合式实战
  • 五大 AI 工具实战指南:豆包、即梦、剪映、飞书与扣子
  • CameraLink 图像输出与采集时序及 FPGA 开发参考
  • C++ 入门:命名空间(namespace)详解
  • 数据结构:链式二叉树递归遍历与接口实现
  • Git 代码上传 Gitee 实战指南
  • 指针与数据结构:核心原理与实战解析
  • 零暴露公网 IP 访问本地 AI 服务的方法与数据隐私保护

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online