synchronized修饰静态方法时锁的是当前类的Class对象,所有线程调用该方法均竞争同一把锁;它不依赖实例,等价于synchronized(MyClass.class),适用于全局计数器等跨实例协调场景。

synchronized 修饰静态方法时,锁的是当前类的 Class 对象,比如 MyClass.class。这意味着所有线程——无论操作的是哪个实例、甚至没有实例——调用该静态方法时,都必须竞争同一把锁。
语法写法
在 static 关键字之后、返回类型之前加上 synchronized:
public static synchronized void doSomething() { ... }private static synchronized int getNextId() { return ++counter; }
关键行为特点
它不依赖任何对象实例,而是作用于“类本身”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 即使创建了 100 个
IdGenerator实例,所有线程调用getNextId()仍串行执行 - 与实例方法上的
synchronized完全无关:一个线程持有实例锁,不影响另一个线程进入静态同步方法 - 等价于在方法内部写
synchronized (MyClass.class) { ... }
典型使用场景
适合需要跨所有实例统一协调的逻辑:
立即学习“Java免费学习笔记(深入)”;
- 全局计数器(如 ID 生成器)
- 单例类的初始化控制(配合双重检查时注意 volatile)
- 类级别的资源初始化或清理(如首次加载配置)
注意事项
容易忽略但影响线程安全的点:
- 子类重写该静态方法时,
synchronized不会自动继承,必须显式写出 - 不能与
final或native同时修饰同一个方法(编译报错) - 若静态方法内只读取 final 静态字段,通常无需加锁;但涉及修改共享状态就必须加

















