类锁锁定的是类的Class对象,仅阻塞同类静态同步操作,不影响实例方法、非静态方法及其他类的静态方法;类锁与实例锁互不干扰,只约束类级别共享状态(如静态变量)的并发访问。

类锁(static synchronized 方法或 synchronized(Class.class) 代码块)锁定的是该类的 Class 对象,不是某个具体实例。它影响的是整个类层面的并发行为,而不是单个实例的访问限制。
类锁只阻塞同类的静态同步操作
当一个线程进入类锁保护的区域(如 static synchronized 方法),其他线程若也试图进入该类的任意 静态 synchronized 方法 或 以 Class 对象为锁的同步块,就会被阻塞。但以下操作完全不受影响:
- 该类的任何非静态方法(无论是否 synchronized)
- 该类不同实例的 synchronized 实例方法(它们用的是
this锁,彼此独立) - 其他类的静态同步方法(锁对象是各自 Class,互不干扰)
类锁与实例锁互不干扰
类锁和实例锁使用的是两个完全不同的锁对象:
- 实例方法上的
synchronized锁住的是当前实例(this) - 静态方法上的
synchronized锁住的是MyClass.class
这意味着:一个线程正在执行 obj1.increment()(实例锁),另一个线程完全可以同时执行 MyClass.resetCount()(类锁),两者不会互相等待。
立即学习“Java免费学习笔记(深入)”;
类锁影响所有静态资源的并发访问
它真正约束的是对 类级别共享状态 的并发修改,比如:
- 静态变量(如
private static int totalCount) - 静态初始化逻辑
- 类加载阶段的元数据变更(极少手动操作)
只要多个线程要修改同一份静态数据,就必须通过类锁协调——否则会出现竞态条件。它不阻止你创建新实例,也不阻止调用实例方法,只管“属于这个类、不属于任何实例”的那部分东西。
注意:类锁不是“锁住整个类”
常见误解是“加了类锁,整个类就动不了了”。实际上:
- 普通对象创建(
new MyClass())完全不受限 - 实例字段读写(非静态)默认无同步,可并发进行
- 只有显式使用
MyClass.class或static synchronized的地方才受该锁约束
它的作用范围精准而明确:仅限于以该类 Class 对象为监视器的所有同步入口。


















