synchronized 的同步实现由 JVM 底层通过对象监视器(Monitor)、对象头 Mark Word 和 monitorenter/monitorexit 字节码指令协同完成,支持偏向锁、轻量级锁、重量级锁三级升级机制,且锁对象依语法形式分别为 this、Class 或显式指定对象。

synchronized 的同步实现不是靠 Java 代码本身,而是由 JVM 在底层通过对象监视器(Monitor)配合对象头和字节码指令共同完成的。
基于对象头的锁状态管理
每个 Java 对象在内存中都有一个对象头,其中关键部分是 Mark Word。它会动态存储以下信息:
- 哈希码、GC 分代年龄等元数据
- 当前锁的状态:无锁、偏向锁、轻量级锁、重量级锁
- 指向线程栈中 Lock Record 的指针(轻量级锁时)
- 指向 Monitor 对象的指针(重量级锁时)
当线程尝试获取锁时,JVM 会根据 Mark Word 的当前值决定走哪条锁路径,并可能触发锁升级。
字节码层面的指令支撑
synchronized 编译后不生成新类或方法,而是插入两条 JVM 指令:
立即学习“Java免费学习笔记(深入)”;
- monitorenter:在进入同步块/方法前执行,尝试获取 Monitor
- monitorexit:在退出同步块/方法前执行,释放 Monitor
这两条指令由解释器或 JIT 编译器处理。例如,InterpreterRuntime::monitorenter 会判断是否启用偏向锁;若启用,先走 fast_enter;否则走 slow_enter 进入更重的锁逻辑。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Monitor 与锁升级机制
Monitor 是 JVM 内部的同步组件,本质是一个 C++ 结构体,包含:
- Owner:记录当前持有锁的线程
- EntryList:等待获取锁的线程队列
- WaitSet:调用 wait() 后挂起的线程队列
JDK 1.6 起引入锁升级优化,按竞争程度逐步演进:
- 偏向锁:无竞争时,仅用一次 CAS 将线程 ID 写入 Mark Word,开销极小
- 轻量级锁:存在少量竞争时,在线程栈中创建 Lock Record,通过 CAS 替换 Mark Word
- 重量级锁:竞争激烈时,膨胀为 Monitor,线程进入操作系统级阻塞,性能代价最高
锁只能升级不能降级,但偏向锁可被撤销(如发生竞争)。
三种语法形式对应不同锁对象
synchronized 的语义差异体现在锁定目标上:
- 修饰实例方法:锁的是当前 this 对象,多个线程调用同一对象的不同 synchronized 方法会互斥
- 修饰静态方法:锁的是当前类的 Class 对象,所有该类实例共享同一把锁
- 修饰同步代码块:显式指定锁对象,灵活性高,推荐使用私有 final 对象避免外部干扰
无论哪种形式,最终都归结为对某个对象(或 Class)的 Monitor 的争夺。

















