synchronized对象锁通过锁定当前实例(this)串行化访问共享实例变量,保护的是读-改-写复合操作而非变量本身;需确保所有临界区使用同一把锁,避免锁不一致、外部干扰或构造期竞态。

synchronized 对象锁保护实例成员变量,本质是通过锁定当前实例(this)来串行化对共享实例变量的访问。它不直接“锁变量”,而是确保同一时刻只有一个线程能执行被该锁保护的代码块——从而避免多个线程同时读-改-写导致的数据错乱。
对象锁作用于实例方法时自动锁定 this
当用 synchronized 修饰非静态方法时,JVM 自动以调用该方法的对象实例(即 this)作为锁对象:
- 不同实例调用同一同步方法,互不影响——因为锁的是各自对象,不是类
- 同一个实例被多个线程并发调用该方法时,线程必须排队获取该实例的锁
- 适合保护该实例内部的私有成员变量,比如计数器、状态标志、缓存等
同步代码块显式指定 this 或其他实例对象
若只需保护部分逻辑,或想复用某个对象作为锁(如专用锁对象),可用 synchronized(this) 或 synchronized(shareLock):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- synchronized(this) 效果等同于同步实例方法,但粒度更细、可读性更强
- 推荐使用独立的私有 final 对象(如 private final Object lock = new Object();)作为锁,避免外部干扰
- 不能用可变对象(如 String、Integer)作锁,因可能被其他代码意外同步,引发死锁或性能问题
关键点:保护的是操作,不是变量本身
即使成员变量是 private,也不代表线程安全;真正需要保护的是“读取→修改→写回”这类复合操作:
立即学习“Java免费学习笔记(深入)”;
- 例如 count++ 实际包含 get、add、put 三步字节码,非原子
- volatile 只保证可见性,无法防止竞态条件,不能替代 synchronized
- 只要所有访问该变量的临界区都用同一把对象锁(如 this 或专用 lock),就能保证线程安全
常见误区与注意事项
容易出错的地方往往不在语法,而在锁的一致性和范围:
- 一个变量被多个方法修改,但只在部分方法加了 synchronized → 不安全
- 用 this 锁,却在外部暴露了该对象并被其他代码同步 → 锁被意外争抢
- 在构造器中启动线程并访问未完全初始化的实例变量 → 即使加锁也可能看到部分构造状态
- 子类重写同步方法,若未保持同步语义,可能破坏线程安全性

















