synchronized静态方法在运行时通过类锁(Class对象)实现线程互斥,锁定整个类而非实例,用于保护静态资源;类加载阶段不受其影响,但静态初始化块由JVM保证线程安全。

synchronized 在类加载阶段不生效,它只在运行时起作用;真正影响静态方法并发控制的,是它锁定的是类的 Class 对象,也就是每个类在 JVM 中唯一的类元数据实例。
静态方法加 synchronized 的本质是“类锁”
当用 synchronized 修饰静态方法时,JVM 实际上是把当前类的 Class 对象(如 MyClass.class)作为锁对象。所有线程调用该类任意一个 synchronized 静态方法,都必须竞争同一把锁。
- 即使创建了多个
MyClass实例,它们调用静态同步方法仍互斥 - 不同线程同时调用
method1()和method2()(两个 synchronized static 方法),也会排队执行 - 锁的粒度是整个类,不是某个对象,因此适合保护静态变量或全局资源
类加载过程本身不受 synchronized 控制
类加载由 ClassLoader 完成,属于 JVM 内部机制,synchronized 关键字无法介入类加载过程。但要注意:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 类的 静态初始化块(
static {})是线程安全的:JVM 保证一个类只会被初始化一次,且由首次主动使用该类的线程完成初始化,其他线程阻塞等待 - 这个“安全”不是靠 synchronized 实现的,而是 JVM 规范强制要求,底层依赖类锁(即
MyClass.class)来协调 - 所以你在静态块里写普通代码,不需要手动加 synchronized —— JVM 已经帮你锁住了
如何显式用类锁实现更灵活的控制
除了修饰静态方法,你还可以在任意代码中直接使用 MyClass.class 作为锁对象,获得和 synchronized 静态方法等效的效果:
立即学习“Java免费学习笔记(深入)”;
-
synchronized(MyClass.class) { /* 临界区 */ }—— 锁住整个类,和 synchronized static 方法效果一致 - 适合把同步逻辑拆得更细,比如只对某段高竞争代码加锁,而不是整个方法体
- 注意不要混用:如果一部分用
synchronized static,另一部分用synchronized(MyClass.class),它们锁的是同一个对象,能正确互斥
常见误区提醒
容易混淆的是“类锁”和“对象锁”的隔离性:
- 一个线程持有
MyClass.class锁(类锁),不影响其他线程调用该类某个实例的synchronized普通方法(对象锁)—— 两者完全不冲突 - 静态方法同步保护的是 静态成员,实例方法同步保护的是 实例成员,别指望用实例锁去保护静态变量
- 若静态方法里操作了非静态字段,需额外确认是否引入了对象状态依赖,这可能破坏设计边界

















