**课程导读:读懂 synchronized,从“知其然”到“知其所以然”**
在 Java 并发编程的体系中,`synchronized` 往往是最先被接触、却也最容易误解的关键字。许多开发者习惯将其视为一种简单的“锁”工具,认为加上它就能解决线程安全问题。然而,当面试中被追问“synchronized 是如何实现的”或“锁升级的过程是怎样的”时,不少候选人便会露怯。本课程旨在打破这一认知壁垒,带你深入 JVM 底层,彻底吃透 `synchronized` 的实现原理。
并发之所以难,难在它对硬件架构和内存模型的双重依赖。`synchronized` 并非凭空产生,而是 Java 语言对底层操作系统互斥机制的一种封装。在本节课中,我们将首先拆解 `synchronized` 的执行流程,理解编译器如何将同步代码块转化为字节码指令,进而揭示 `monitorenter` 和 `monitorexit` 指令在 JVM 中的具体作用。你将明白,所谓的“同步”,本质上是线程对对象监视器(Monitor)的争抢过程。
为了更深入地理解 Monitor 的工作机制,课程将把视角切入 JVM 内部,详细剖析虚拟机中对象的内存布局。在 HotSpot 虚拟机中,每一个对象在内存里都由三部分组成:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。其中,对象头承载着最关键的信息,它是 JVM 感知当前对象锁状态的核心窗口。
我们将重点解析对象头中的 Mark Word 结构。你可能会惊讶地发现,同一个 Mark Word 在不同状态下(无锁、偏向锁、轻量级锁、重量级锁)竟然存储着截然不同的数据内容。通过细致的位图解析,你将清晰地看到:
1. **偏向锁**阶段,Mark Word 如何记录 Thread ID 以实现零开销同步;
2. **轻量级锁**阶段,如何通过栈帧中的 Lock Record 和 Cas 操作来实现自旋等待,避免线程阻塞;
3. **重量级锁**阶段,Mark Word 指针如何指向堆中的 Monitor 对象,从而引发线程阻塞与唤醒的昂贵开销。
课程还特别指出了锁升级这一关键概念:`synchronized` 的性能优化史,实际上就是一部锁从“无”到“有”、从“轻”到“重”再到“粗”的演进史。理解这个过程,不仅有助于你在高并发场景下做出更合理的代码设计,更能让你在面临性能瓶颈时,知道如何通过参数调整或逻辑重构来规避不必要的线程上下文切换。
无论你是准备应对高薪技术面试,还是希望夯实 Java 并发编程的基础内功,这门课都是一份不可多得的指南。让我们透过看似简单的关键字,看清 JVM 引擎盖下的精密机械构造,真正掌握并发编程的底层逻辑。
课程目录
1-1 [并发难,难在哪?synchronize原理] synchronize是如何实现同步的 (27:23).mp4 1-2 [并发难,难在哪?synchronize原理] 虚拟机当中对象的布局是怎样的 (37:24).mp4 1-3 [并发难,难在哪?synchronize原理] 解析对象的对象头信息 (30:58).mp4






