synchronized修饰成员方法等价于synchronized(this),锁的是当前对象实例,不同对象互不影响;静态方法需static synchronized,锁的是class对象;同步代码块可精准控制锁范围。

在 Java 中,用 synchronized 修饰成员方法,等价于用 synchronized(this) 对整个方法体加锁,即以当前对象实例为锁,确保同一时刻只有一个线程能执行该方法(针对同一个对象)。
修饰非静态成员方法
这是最常见用法。synchronized 作用于实例方法时,锁的是调用该方法的对象(this),不同对象之间的同步互不影响。
- 多个线程调用 同一个对象 的 synchronized 方法,会串行执行
- 多个线程调用 不同对象 的 synchronized 方法,彼此不阻塞,可并发执行
- 一个对象的 synchronized 方法和普通方法之间无锁竞争,可同时运行
示例:
public class Counter {
private int count = 0;
// 同步实例方法:锁的是 this
public synchronized void increment() {
count++;
}
public int getCount() {
return count;
}
}
不能修饰静态方法(需显式写 static synchronized)
直接写 synchronized static void method() 是合法的,但要注意:静态方法上的 synchronized 锁的是当前类的 Class 对象(如 Counter.class),不是 this。它与实例方法的锁是两把不同的锁,互不干扰。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 所有线程调用该类的任意静态 synchronized 方法,都会竞争同一把 Class 锁
- 静态 synchronized 方法和实例 synchronized 方法可以同时执行(锁不同)
示例:
public class Counter {
private static int staticCount = 0;
public static synchronized void incrementStatic() {
staticCount++;
}
}
等效写法:同步代码块替代 synchronized 方法
用 synchronized(this) { ... } 包裹方法体,效果完全一致,但更灵活——可只锁关键段,避免锁整个方法带来的性能开销。
- 适合方法体较长、仅部分逻辑需要同步的场景
- 减少锁持有时间,提升并发度
- 注意:必须保证锁对象一致(通常用 this 或 final 成员变量)
示例:
public void increment() {
synchronized(this) {
count++; // 只锁这一行,而非整个方法
}
}
注意事项与常见误区
synchronized 成员方法看似简单,但容易忽略细节:
- 锁的是对象实例,不是方法或代码;继承中子类重写该方法仍保持同步语义
- 若方法内抛出异常,JVM 自动释放锁,无需手动处理
- 不能继承 synchronized 关键字:父类方法 synchronized,子类重写后默认不带 synchronized,需显式添加
- 避免在 synchronized 方法中调用外部可变对象的同步方法,以防死锁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










