synchronized锁this与锁x.class的根本区别在于锁目标不同:前者锁定当前实例,各实例互不干扰;后者锁定唯一class对象,所有实例线程互斥。

synchronized 锁对象为 this 和锁类对象(如 X.class)的根本区别,在于锁的目标不同:前者锁的是当前实例,后者锁的是整个类的 Class 对象。这直接决定了同步的作用范围和线程是否互斥。
锁的目标对象不同
锁 this 时,实际锁定的是调用该代码块或方法的那个具体对象实例(比如 new X())。每个实例都有独立的 monitor,所以多个线程操作不同实例时,不会互相阻塞。
锁 X.class 时,锁定的是 JVM 中唯一存在的 X.class 对象。无论创建多少个 X 实例,所有线程执行该类锁代码时,都必须竞争同一把锁。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
作用范围与线程互斥关系不同
- 两个线程分别调用 x1.method() 和 x2.method(),且方法内是 synchronized(this) → 不互斥,可并发执行
- 两个线程分别调用 x1.doStatic() 和 x2.doStatic(),且方法是 static synchronized 或含 synchronized(X.class) → 互斥,只能串行执行
- 同一个线程在 x1 上执行 synchronized(this),另一个线程对 X.class 加锁 → 完全不冲突,因为锁对象不同
适用场景由数据归属决定
保护的数据属于“每个对象一份”,就用 this 锁:
- 实例变量,如 private int balance;
- 对象内部状态,如缓存、计数器等仅限当前实例使用的字段
保护的数据属于“整个类一份”,就必须用类对象锁:
- 静态变量,如 private static Map
configCache; - 全局资源控制,如单例初始化、连接池计数、类级别日志写入
写法对应关系要清楚
以下三组写法本质上是等价的:
- public synchronized void instanceMethod() { } ⇔ synchronized(this) { }
- public static synchronized void staticMethod() { } ⇔ synchronized(X.class) { }
- synchronized(obj) { }(obj 是任意非 null 对象)→ 锁 obj 本身,与 this 或类无关,属于自定义细粒度锁
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










