synchronized本质是基于对象监视器(Monitor)的互斥机制,由JVM通过对象头Mark Word动态控制锁状态;其锁升级过程为无锁→偏向锁→轻量级锁→重量级锁,单向不可逆,核心目标是减少用户态/内核态切换开销。
synchronized 的本质是基于对象监视器(Monitor)的互斥机制,其行为由 JVM 在运行时通过对象头中的 Mark Word 动态控制,而非简单“加一把固定锁”。理解它,关键不在语法,而在对象内存结构与锁状态的实时映射关系。
synchronized 从不“锁代码”,而是“锁对象”——所有同步操作最终都指向一个 Java 对象,该对象内部关联一个 Monitor 实例。Monitor 是 JVM 级别的同步组件,包含:
当线程执行 monitorenter 指令(编译后插入同步块入口),JVM 就尝试将该线程设为 Monitor 的 _owner;执行 monitorexit 时则递减进入计数,归零后释放 Monitor 并唤醒 _EntryList 中的线程。
每个 Java 对象的对象头中都有一个 Mark Word,它是锁升级的“状态寄存器”。在 64 位 JVM 中占 8 字节,其内容随锁状态变化而重解释:
立即学习“Java免费学习笔记(深入)”;
这种复用设计让同一片内存能承载不同语义,是锁优化的物理基础。
JDK 1.6 引入的锁升级机制,核心目标是避免过早陷入操作系统级阻塞(即重量级锁),减少用户态/内核态切换开销:
升级是单向的(不可逆),但并非严格逐级——例如高竞争场景下,对象可能直接从无锁跳到重量级锁。
synchronized 天然可重入,依赖 Monitor 内部的 进入计数器(_recursions):每次加锁 +1,每次解锁 -1,仅当归零才真正释放 Monitor。
它同时提供三大并发原语保障:
这些语义不是靠 Java 代码实现,而是 JVM 在字节码执行层面硬保证的底层契约。