Java中synchronized修饰静态方法时锁的是该类的Class对象,即类锁;所有线程调用该方法必须竞争同一把锁,确保对静态变量等类级别资源的互斥访问。

Java 中用 synchronized 锁住静态方法,本质就是使用**类锁(Class-level lock)**,即以当前类的 Class 对象为锁目标,确保所有线程在调用该静态方法时互斥执行。
静态同步方法的写法
只需在 static 方法前加上 synchronized 修饰符:
public static synchronized void doSomething() { ... }- 等价于:
public static void doSomething() { synchronized (MyClass.class) { ... } }
两种写法语义完全一致,JVM 都会将锁对象设为 MyClass.class —— 这是 JVM 中每个类唯一的一个字节码对象。
为什么能实现类级同步?
关键在于锁对象的唯一性:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 每个类在 JVM 中只有一个
Class实例,无论创建多少个该类的对象,MyClass.class始终是同一个引用 - 所有线程调用该静态方法时,都必须竞争同一把锁,自然形成串行化访问
- 它和实例方法的
this锁无关:不同对象的实例方法可并行,但静态方法永远被“一把锁”管住
典型应用场景
适合保护**类级别共享资源**,比如:
- 静态计数器:
private static int totalCount = 0;的增减操作 - 单例工厂的初始化逻辑(双重检查外的兜底同步)
- 全局配置缓存的加载或刷新
- 日志器、连接池等静态工具类的线程安全方法
常见误区提醒
以下写法**无法**保护静态资源:
-
public synchronized void wrongUpdate() { staticVar++; }→ 锁的是this,每个实例一把锁,对静态变量无效 -
synchronized(this) { staticVar++; }→ 同样错,锁实例对象不控制静态域 - 用不同类的
Class对象做锁(如String.class),与当前类无关,起不到同步作用
务必确认锁对象是本类的 ClassName.class,才能真正实现类级同步。

















