synchronized修饰实例方法时锁住当前对象(this),确保同一时刻仅一个线程执行该对象的同步方法;不同对象间互不影响,适用于保护实例变量且操作简单的场景。

在 Java 中,用 synchronized 修饰实例方法,是最直接的线程同步方式之一。它的核心是:**锁住当前对象(this)**,确保同一时刻只有一个线程能执行该对象的这个同步方法。
锁对象是 this,作用于当前实例
当多个线程调用同一个对象的 synchronized 实例方法时,它们会竞争该对象的内部锁(monitor)。谁抢到锁,谁执行;其余线程阻塞等待。但不同对象的调用互不影响——因为锁的是各自独立的 this。
- 写法:在方法返回类型前加 synchronized 关键字
- 等效写法:把整个方法体包进 synchronized(this) { ... } 代码块中
- 适用场景:共享状态属于实例变量(如
private int count),且操作逻辑简单、粒度适中
典型示例与注意事项
比如一个计数器类:
public class Counter {
private int value = 0;
// 同步实例方法:锁的是 this
public synchronized void increment() {
value++;
}
public synchronized int getValue() {
return value;
}
}
- 必须保证所有读写共享变量的操作都走同步路径(如
getValue()也要 synchronized),否则可能读到过期值(破坏可见性) - 如果只对部分逻辑加锁,或需要更细粒度控制,建议改用同步代码块,避免锁住整个方法影响性能
- 不可继承:子类重写该方法时,synchronized 修饰符不会自动继承,需显式加上
和静态方法、代码块的区别要点
别混淆三种用法的锁目标:
- 实例方法 → 锁 this(每个对象一把锁)
- 静态方法 → 锁 MyClass.class(整个类一把锁,跨所有实例)
- 同步代码块 → 可指定任意对象作锁,灵活性最高
选实例方法同步,前提是你要保护的数据确实是某个对象独有的状态,且不希望其他对象干扰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











