synchronized修饰实例方法锁住当前对象实例(this),修饰静态方法锁住类的Class对象;实例锁互不干扰,类锁全局唯一;实例锁保护对象级状态,类锁保护类级共享资源;二者完全独立。

锁的目标对象完全不同
修饰实例方法时,synchronized 锁住的是调用该方法的当前对象实例(this)。每个 new 出来的对象都有独立的锁,互不干扰。
修饰静态方法时,synchronized 锁住的是该类在 JVM 中唯一的Class 对象(如 MyClass.class)。不管创建多少个实例,所有线程访问这个静态同步方法,争抢的都是同一把锁。
并发行为表现截然不同
多个线程调用不同实例的同步实例方法:
- 可以同时执行 ✅
- 因为 t1.instanceMethod() 和 t2.instanceMethod() 分别锁定 t1 和 t2 两个对象
多个线程调用不同实例的同步静态方法:
- 必须串行执行 ❗
- 因为 t1.staticMethod() 和 t2.staticMethod() 实际都等价于 synchronized(MyClass.class),共用一把类锁
适用的数据范围有明确边界
同步实例方法适合保护对象级别的状态,比如:
- 成员变量(private int balance;)
- 单个用户账户的操作,不同账户之间无需互斥
同步静态方法适合保护类级别的共享资源,比如:
- 静态计数器(private static int totalUsers = 0;)
- 全局配置缓存、单例初始化逻辑
两者锁之间完全不互相影响
一个线程持有某个对象的实例锁,不影响另一个线程获取该类的 Class 锁;反之亦然。
- 线程 A 调用 obj.doInstanceSync() → 锁住 obj
- 线程 B 同时调用 MyClass.doStaticSync() → 锁住 MyClass.class
- 这两把锁无关,不会阻塞彼此

















