synchronized修饰静态方法时锁的是该类的class对象,因为静态方法属于类级别且jvm中每个类有唯一class实例,天然适合作为全局锁;等价于synchronized(myclass.class),与实例锁(this)完全独立,确保对静态变量等类级资源的串行访问。

synchronized 修饰静态方法时,锁的对象是该类对应的 Class 对象(例如 MyClass.class)。
为什么是 Class 对象?
Java 中每个类在 JVM 里有且仅有一个 Class 实例,它代表这个类的运行时元数据。静态方法属于类级别,不依赖任何具体实例,所以锁必须落在一个全局唯一的对象上——Class 对象天然满足这个要求。
这等价于手动写:synchronized (MyClass.class) { ... },只是语法更简洁。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
和实例方法的锁完全独立
- 实例方法加
synchronized→ 锁的是调用它的那个对象(this) - 静态方法加
synchronized→ 锁的是MyClass.class - 两者互不影响:线程 A 持有某个对象的实例锁,线程 B 可以同时获取该类的 Class 锁
实际表现就是“全局串行”
不管创建多少个对象,也不管哪个线程调用,只要访问同一个类的任意 static synchronized 方法,所有线程都得排队争抢同一把锁。
比如:Account.incrementTotal()(统计总账户数),多个线程调用它,结果一定是严格顺序执行,避免重复计数。
适用场景很明确
- 修改静态变量(如计数器、缓存初始化)
- 单例模式的双重检查锁定中,
getInstance()的静态部分 - 类加载阶段的资源注册或配置加载
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










