synchronized修饰实例方法时锁的是当前实例对象(this),即调用该方法的具体对象引用;不同实例互不干扰,无法保护静态变量,应改用static synchronized或synchronized(类.class),且推荐用私有final锁对象替代this以避免外部干扰。

synchronized 修饰实例方法时锁的是哪个对象
锁的是当前实例对象,也就是 this。不是类、不是方法签名、不是返回值,就是调用该方法的那个具体对象引用。
这意味着:只要两个线程操作的是同一个对象实例(比如都调用 counter1.increment()),它们就会竞争同一把锁;但如果一个线程调 counter1.increment(),另一个调 counter2.increment(),就完全不冲突——哪怕 counter1 和 counter2 是同一个类的两个不同实例。
- 错误理解:“synchronized 方法 = 整个类被锁住” → 实际上是每个实例各自有锁
- 典型误用:在工具类中写了个
synchronized实例方法,却每次 new 一个新对象去调用 → 完全没同步效果 - 验证方式:打印
this.hashCode(),确认多线程是否真的指向同一个实例
为什么不能靠 synchronized 实例方法保护静态变量
因为 this 锁和静态变量之间没有绑定关系。实例方法加了 synchronized,只保证“对这个对象的同步方法调用互斥”,但静态变量属于类,所有实例共享,而锁却分散在各个实例上。
例如下面这段代码依然线程不安全:
public class BadCounter {
private static int count = 0;
public synchronized void increment() {
count++; // ❌ 多个实例的 increment() 各自拿自己的 this 锁,但都改同一个 count
}
}
- 现象:多个线程分别调用不同实例的
increment(),count最终远小于预期 - 根本原因:锁对象(
this)和被修改的数据(count)不在同一作用域层级 - 修复方案:要么改用
static synchronized方法,要么在方法内用synchronized(YourClass.class)块
实例方法同步 vs 同步代码块:什么时候该换用 synchronized(this)
当需要更细粒度控制锁的持有范围时,应主动把 synchronized 从方法声明移到代码块里。实例方法加锁会锁住整个方法体,包括可能不需要同步的 IO、计算或条件分支。
比如这个常见场景:
public void processAndSave() {
String data = fetchFromNetwork(); // 不需要同步
synchronized(this) {
updateCache(data); // 需要同步
persistToDB(data); // 需要同步
}
sendNotification(); // 不需要同步
}
- 性能影响:网络请求或日志打印如果被锁住,会拖慢整个同步段,降低吞吐
- 死锁风险:若
sendNotification()内部又调用了其他同步方法,且锁顺序不一致,容易引发死锁 - 注意:
synchronized(this)和synchronized实例方法语义等价,但前者让你能精确圈出临界区
外部暴露 this 引用会导致什么问题
如果类中提供了返回 this 的方法(比如链式调用的 return this;),外部代码可能拿到该引用并用它做同步,干扰你原本的锁逻辑。
例如:
public class UnsafeChain {
public synchronized void doWork() { /* ... */ }
public UnsafeChain self() { return this; } // 危险!
}
// 外部代码:
UnsafeChain obj = new UnsafeChain();
new Thread(() -> {
synchronized(obj.self()) { /* 拿走锁,阻塞 doWork() */ }
}).start();
- 后果:你的同步逻辑被外部不可控代码破坏,调试时难以定位
- 解决方案:用私有 final 锁对象替代
this,如private final Object lock = new Object(); - 额外提醒:避免用非
final成员变量作锁对象,防止运行时被重新赋值导致锁失效
真正起作用的从来不是“写了 synchronized”,而是“所有访问共享状态的路径,是否都通过同一把锁”。哪怕只漏掉一个 setter 或一个内部调用,线程安全就崩了。










