synchronized 通过 JVM Monitor 实现线程安全,支持锁升级(偏向→轻量→重量)、内存可见性与有序性保障、可重入及自动释放。

synchronized 实现线程安全的核心,是靠 JVM 内置的 Monitor(监视器)机制,配合对象头中的锁状态与内存可见性规则,从底层保障原子性、可见性和有序性三要素。
Monitor 作为锁的执行载体
每个 Java 对象都关联一个 Monitor。当线程执行 synchronized 代码块或方法时,实际是在尝试获取该对象对应的 Monitor 所有权:
- 成功获取后,Monitor 的计数器加 1,所有者设为当前线程;
- 若 Monitor 已被占用,当前线程进入阻塞状态,等待队列中排队;
- 退出同步区域时自动释放 Monitor,计数器减 1,归零后唤醒等待队列中的线程。
锁升级机制兼顾性能与安全
JVM 不是固定用一种锁实现,而是根据竞争程度动态优化:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 无竞争时启用偏向锁:记录首次获得锁的线程 ID,后续同一线程重入无需同步;
- 轻度竞争时升级为轻量级锁:依赖线程栈中的 Lock Record 和 CAS 操作;
- 高竞争时膨胀为重量级锁:依赖操作系统互斥量(Mutex),线程挂起/唤醒开销变大。
内存模型层面保证可见性与有序性
synchronized 不只是“串行执行”,还强制了内存语义:
立即学习“Java免费学习笔记(深入)”;
- 释放锁前,将工作内存中所有共享变量修改刷新到主内存;
- 获取锁后,清空本地缓存,强制从主内存重新读取变量值;
- 通过内存屏障禁止临界区内外的指令重排序,确保代码逻辑顺序执行。
可重入与隐式释放降低使用门槛
它天然支持可重入:同一线程多次进入同一把锁不会死锁;且无需手动 unlock —— JVM 在字节码层面插入 monitorenter / monitorexit 指令,或为同步方法添加 ACC_SYNCHRONIZED 标志,由运行时自动管理生命周期。

















