synchronized通过对象锁或类锁实现线程互斥,确保同一时刻仅一个线程执行同步方法:实例方法锁this、静态方法锁class,支持可重入、异常自动释放锁,并保障可见性。

在 Java 中,用 synchronized 修饰方法是最直接的线程安全手段之一。它通过“对象锁”或“类锁”机制,确保同一时刻只有一个线程能执行该方法,从而避免多个线程并发修改共享数据导致的竞态条件。
同步实例方法:锁住当前对象(this)
当 synchronized 修饰非静态方法时,锁对象是调用该方法的实例(即 this)。不同对象实例之间的同步互不影响。
- 多个线程调用同一个对象的同步实例方法 → 串行执行,安全
- 多个线程调用不同对象的同步实例方法 → 各自持有一把锁,不互斥,可能并发
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
private int count = 0;
public synchronized void increment() {
count++; // 此处操作被 this 锁保护
}
}
同步静态方法:锁住类对象(Class)
当 synchronized 修饰静态方法时,锁对象是该类的 Class 对象(如 Counter.class)。所有该类的实例共用这一把锁。
- 适用于需要跨实例控制全局状态的场景(如计数器、单例初始化)
- 静态同步方法与实例同步方法之间不冲突,因为锁对象不同
示例:
public static synchronized void reset() {count = 0;
}
关键行为和注意事项
- 异常时自动释放锁:无论方法正常结束还是抛出未捕获异常,JVM 都会释放锁,无需手动处理
- 可重入:同一线程可重复进入自己已持有的锁(比如同步方法内调用另一个本类的同步方法)
- 不可继承:子类重写父类的同步方法时,synchronized 关键字不会自动继承,需显式加上
- 不能修饰构造方法:构造过程天然串行,且对象尚未完全创建,加锁无意义
为什么能保证线程安全?
本质是靠 JVM 的内置锁(Intrinsic Lock)实现互斥:
- 每个 Java 对象都有一个关联的锁,线程进入同步方法前必须先获取该锁
- 锁被占用时,其他线程阻塞在入口处,直到持有者释放(方法返回或异常退出)
- 同时保障了可见性:锁释放前对共享变量的修改,对下一个获取该锁的线程立即可见
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










