类锁通过锁定Class对象确保静态同步代码互斥执行,保障静态共享资源读写一致性;其本质是竞争同一Class实例的monitor,强制串行访问静态变量与方法,解决可见性与竞态问题,粒度粗于实例锁。

类锁(Class Lock)通过锁定整个类的 Class 对象,确保同一时刻只有一个线程能执行被其保护的静态同步代码,从而保障静态共享资源的读写一致性。
类锁的本质是 Class 对象的 monitor
Java 中每个类在加载时都会生成唯一的 Class 实例(如 MyClass.class),synchronized 修饰静态方法或用 MyClass.class 作为锁对象的同步块,实际是对该 Class 对象加锁。所有线程竞争的是同一个 monitor,因此能串行化对静态变量、静态方法等类级别资源的访问。
保护静态共享资源的读写操作
当多个线程并发读写静态字段(如 public static int counter)时,若无同步,会出现可见性丢失和竞态条件。类锁强制这些操作互斥:
- 写操作必须先获取类锁,修改后释放锁,此时 JMM 保证写入刷新到主内存;
- 后续读操作需重新获取类锁,从而强制从主内存读取最新值,解决缓存不一致;
- 读与写不能同时进行——即使多个线程只读,只要存在写操作,就必须排队等待锁,避免“脏读”或“部分更新”。
与实例锁的关键区别
类锁作用于类级别,不随对象实例变化,因此:
立即学习“Java免费学习笔记(深入)”;
- 它能保护所有静态成员,无论多少个对象实例存在;
- 一个线程持有类锁时,其他线程无法进入任何该类的静态同步方法或对应 Class 对象的同步块;
- 但不影响该类不同实例的实例方法同步(实例锁和类锁互不干扰)。
使用建议与注意事项
类锁虽简单有效,但粒度较粗,易造成不必要的阻塞:
- 优先考虑是否真需全局串行——例如计数器递增可用
AtomicInteger替代; - 避免在类锁内执行耗时操作(如 I/O、远程调用),否则拖慢所有静态同步路径;
- 显式使用
synchronized (MyClass.class)比synchronized static方法更灵活,便于分段加锁或组合锁策略。


















