人口大计划
62.70M · 2026-04-23
synchronized 是 Java 最经典的并发关键字,用于保证原子性和可见性。本文将系统介绍 synchronized 的三种使用方式,以及其在 JVM 层面的实现机制(对象头、锁升级、monitorenter/monitorexit 指令),带你从应用到原理全面理解这一核心同步工具。
在并发编程中,多个线程同时访问共享资源可能导致:
synchronized 的作用就是提供一种 互斥锁机制,保证同一时间只有一个线程能进入临界区,从而解决上述问题。
public synchronized void increment() {
count++;
}
public static synchronized void staticIncrement() {
counter++;
}
Class<类名>)。public void add() {
synchronized (lock) {
count++;
}
}
实例方法 锁住对象实例;静态方法 锁住类对象;代码块 锁住指定对象。synchronized 在 JVM 中是通过 对象头(Object Header)+ Monitor(监视器锁) 来实现的。
在 HotSpot JVM 中,每个对象头(Object Header)包含:
锁相关的核心信息都在 Mark Word 中,比如锁标志位(00、01、10、11 对应不同状态)。
编译器在同步代码块前后插入两条字节码指令:
monitorenter:尝试获取锁;monitorexit:释放锁。一个线程在执行 monitorenter 时,如果锁已被占用,就会阻塞直到获取成功。
HotSpot 对 synchronized 进行了多种优化,避免频繁进入内核态:
这种 锁升级(无锁 → 偏向锁 → 轻量级锁 → 重量级锁) 的设计,大幅提高了 synchronized 的性能。
public synchronized void methodA() {
methodB(); // 同一线程可再次进入
}
public synchronized void methodB() {}
synchronized 内部会在 释放锁时刷新主存、获取锁时读取主存,保证线程间数据可见性。String 常量或全局对象作为锁,容易引发意外竞争;private final Object lock = new Object(); 作为显式锁对象。ReentrantLock、StampedLock、ReadWriteLock 等并发工具类,获得更灵活的功能(如中断、超时、公平性)。synchronized 是 Java 并发的基石,它通过 对象头 + Monitor 实现锁机制,并结合 偏向锁、轻量级锁、重量级锁 提升性能。
三种用法分别对应 对象锁、类锁、自定义锁对象,开发时需要注意锁粒度、锁对象选择以及死锁风险。