synchronized 实现同步的基本单位是monitor,每个java对象天然携带一个monitor,线程需获取其所有权才能执行同步代码;monitor基于对象头实现,支持锁升级,并通过monitorenter/monitorexit指令或acc_synchronized标志控制,同时保障原子性、可见性与有序性。

synchronized 实现同步的基本单位是Monitor(监视器),也称为“对象监视器”或“内置锁”。
Monitor 是每个 Java 对象天然携带的同步单元
每个 Java 对象在 JVM 中都有一个与之关联的 Monitor。线程要执行 synchronized 代码块或方法,必须先获取该对象对应的 Monitor 所有权。Monitor 不是 Java 层面的类或接口,而是 JVM 内部基于对象头(Object Header)实现的同步机制。
- 当线程遇到
synchronized(obj)时,实际是尝试获取obj关联的 Monitor - 对实例方法加
synchronized,等价于synchronized(this),即获取当前实例的 Monitor - 对静态方法加
synchronized,则获取的是该类的Class对象的 Monitor(如MyClass.class)
Monitor 的底层支撑是对象头中的锁记录
JVM 在对象头中预留空间存储锁状态信息,包括偏向锁线程 ID、轻量级锁指向的栈帧地址、重量级锁指向的 ObjectMonitor 结构指针等。锁的升级(偏向 → 轻量 → 重量)正是围绕 Monitor 的不同实现形态展开的。
字节码层面体现为 monitorenter / monitorexit 指令
编译后,synchronized 代码块会插入 monitorenter(进入前获取 Monitor)和 monitorexit(退出时释放 Monitor)指令;而 synchronized 方法则通过 ACC_synchronized 标志位标识,由 JVM 在调用时自动处理 Monitor 获取与释放。
Monitor 保障三大并发特性
它不仅实现互斥(原子性),还隐式提供:
- 可见性:进入 Monitor 前强制从主内存读最新值,退出时强制刷回主内存
- 有序性:Monitor 的获取与释放构成天然的内存屏障,禁止相关指令重排序
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











