静态方法用synchronized修饰时锁的是该类的Class对象,因为静态方法属于类而非实例,无法使用this,JVM自动以MyClass.class为锁目标,所有线程竞争同一把类锁,等效于synchronized(MyClass.class)。

静态方法用 synchronized 修饰时,锁的是该方法所属类的 Class 对象,而不是某个实例。这等价于在方法内部用 synchronized(YourClass.class) 加锁。
为什么静态方法加 synchronized 就锁 Class 对象?
Java 规定:静态方法属于类本身,不依赖任何实例。因此无法锁定 this(因为没有 this)。JVM 自动将锁目标设为该类的 Class 实例,即 MyClass.class。所有线程调用该静态同步方法时,都必须竞争同一把锁。
等效写法对比
以下两种写法效果完全相同:
方式一(简洁写法):
立即学习“Java免费学习笔记(深入)”;
public static synchronized void doSomething() {
// 临界区代码
}
方式二(显式锁 Class 对象):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
public static void doSomething() {
synchronized (MyClass.class) {
// 临界区代码
}
}
两者都确保同一时刻只有一个线程能执行该方法体内的代码。
实际使用注意点
- 不同类的静态同步方法互不影响——
A.class和B.class是两把不同的锁 - 静态同步方法和实例同步方法之间不互斥——一个锁
Class,一个锁具体对象,可并发执行 - 若类被多个类加载器加载(如 Web 应用中),每个加载器生成独立的
Class对象,锁也不共享 - 避免在静态同步方法中做耗时操作,否则会严重阻塞其他线程调用同类其他静态同步方法
典型适用场景
适合需要全局单例控制、类级别资源初始化或计数器更新等场景。例如:
单例双重检查锁中的静态初始化块;
统计某类被创建的总次数;
延迟加载静态配置并保证只初始化一次。

















