synchronized 由 JVM 通过 Monitor 和对象头 Mark Word 协同硬件原子指令(如 CAS、lock 前缀)实现,对应字节码为 ACC_SYNCHRONIZED 标志或 monitorenter/monitorexit 指令,支持锁升级与内存可见性保障。

synchronized 在 Java 中不是靠某一条底层指令实现的,而是由 JVM 通过 对象监视器(Monitor) 和 对象头中的 Mark Word 配合硬件指令协同完成的。它没有对应单一的 CPU 指令,但关键环节依赖于底层原子操作,比如 CAS(Compare-And-Swap)和 lock 前缀指令。
synchronized 对应的字节码指令
编译后,synchronized 的不同用法会生成不同的字节码:
-
同步方法:在方法的访问标志中添加
ACC_SYNCHRONIZED标志位;JVM 执行时自动触发 Monitor 进入/退出逻辑,不显式插入 monitorenter/monitorexit。 -
同步代码块:编译为一对
monitorenter和monitorexit字节码指令;每个指令都作用于指定的对象引用。
Monitor 的底层实现机制
JVM 中的 Monitor 是基于操作系统互斥量(mutex)或条件变量(condition variable)实现的,HotSpot 中具体表现为 ObjectMonitor 结构。其核心流程包括:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 线程执行
monitorenter时,尝试获取对象的 Monitor; - 若 Monitor 未被占用,直接设置锁状态,并将当前线程标记为 Owner;
- 若已被占用,线程进入 EntryList(阻塞队列),等待被唤醒;
- 执行完同步块后,执行
monitorexit,释放 Monitor,并唤醒 EntryList 中的一个线程。
对象头与锁升级过程中的硬件支持
Java 对象头中的 Mark Word 存储锁状态(无锁、偏向、轻量级、重量级)。锁升级过程依赖以下硬件级能力:
立即学习“Java免费学习笔记(深入)”;
- 偏向锁:利用 CAS 修改 Mark Word 中的线程 ID,前提是未被竞争;
- 轻量级锁:用 CAS 将 Mark Word 替换为指向栈中 Lock Record 的指针;失败则膨胀为重量级锁;
-
重量级锁:调用操作系统 mutex,触发线程挂起/唤醒,底层使用
lock cmpxchg等汇编指令保障原子性。
内存可见性与 happens-before 规则
synchronized 不仅控制互斥,还建立明确的内存语义:
- 解锁前,强制将工作内存中修改的共享变量刷新到主内存;
- 加锁时,清空本地工作内存,后续读取必须从主内存重新加载;
- 构成 解锁 → 加锁 的 happens-before 关系,确保临界区内外的有序性和可见性。

















