synchronized修饰实例方法时锁的是当前对象(this),即该方法所属的对象实例;每个Java对象有内置monitor锁,同一对象的多个synchronized实例方法互斥,不同对象间不干扰,等价于synchronized(this)。

synchronized 修饰实例方法时,锁的是调用该方法的**当前对象(this)**,也就是该方法所属的对象实例。
锁的是 this,不是类或方法本身
每个 Java 对象内部都有一个与之关联的监视器(monitor),synchronized 实例方法会尝试获取当前对象(this)的 monitor 锁。只有拿到这个锁的线程才能执行该方法;其他线程若想调用同一个对象的 synchronized 实例方法,必须等待锁释放。
- 不同对象调用各自的 synchronized 实例方法,互不干扰(因为锁的是各自的 this)
- 同一个对象的多个 synchronized 实例方法之间是互斥的(共用同一把 this 锁)
- 非 synchronized 方法不受影响,可被任意线程并发调用
等价于在方法体上加 synchronized(this)
下面两种写法语义完全相同:
public synchronized void doSomething() {
// 同步逻辑
}
等价于:
public void doSomething() {
synchronized(this) {
// 同步逻辑
}
}
本质都是对当前对象实例加锁,确保同一时刻只有一个线程能进入临界区。
注意:静态方法不适用 this 锁
如果方法是 static 的,即使加上 synchronized,锁的也不是 this(因为静态方法没有 this),而是当前类的 Class 对象(如 MyClass.class)。这是两类不同的锁,不能互相阻塞。
- 实例方法锁 → this(某个具体对象)
- 静态同步方法锁 → MyClass.class(整个类的 Class 实例)
常见误区提醒
- 不要误以为“synchronized 方法”会锁住整个对象的所有字段或行为——它只控制对同步代码块/方法的访问
- 锁对象可以被外部显式获取(比如 synchronized(obj)),只要 obj 是同一个引用,就和 synchronized 实例方法共享同一把锁
- 如果实例方法里有 long 或 double 类型的非 volatile 字段读写,仍需注意原子性问题(虽然锁能保证可见性和互斥,但单次读写本身在 JVM 中可能非原子)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











