Java中对象锁始终锁定运行时的实际对象实例,与声明类型、继承关系或方法定义位置无关;无论父类还是子类调用synchronized方法或块,锁的都是this指向的具体堆中对象,同一实例的所有同步入口互斥,不同实例锁独立。

Java 中对象锁在继承体系中的锁定行为,核心只看一点:锁的是运行时的实际对象实例,不是声明类型,也不是类定义。
锁的对象永远是 this 所指的具体实例
无论方法定义在父类还是子类,只要执行的是 synchronized 实例方法或 synchronized(this) 块,锁住的都是当前线程调用时 this 指向的那个堆中对象。这个对象可能是 Child 类型的实例,即使它被声明为 Parent p = new Child(),锁也落在 Child 实例上。
- 父类中定义
public synchronized void f() { ... },子类未重写 → 子类实例调用时,锁的是该子类实例 - 子类重写了该方法但没加
synchronized→ 同步语义丢失,不加锁 - 子类方法体内写
synchronized(this) { ... }→ 锁的仍是当前子类实例 - 两个不同子类(如
ChildA和ChildB)的实例 → 各自拥有独立锁,互不干扰
synchronized 修饰符不会自动继承
Java 规范明确:synchronized 是方法修饰符,不是可继承的语义。子类覆盖父类方法时,同步性必须显式声明。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 父类方法带
synchronized,子类方法签名相同但无该关键字 → 编译通过,但运行时不加锁 - 接口方法不能用
synchronized修饰(编译报错),因为接口不涉及具体对象锁 - 构造方法禁止加
synchronized,对象创建过程本身已由 JVM 保证线程安全
多态调用下锁归属不变
用父类引用指向子类实例再调用同步方法,锁依然绑定到实际对象。
立即学习“Java免费学习笔记(深入)”;
-
Parent p = new Child(); p.syncMethod();→ 若syncMethod是父类中定义的synchronized方法,锁的是Child实例 - 若
Child重写了syncMethod且未加synchronized,则调用的是无锁版本,父类的同步逻辑失效 - 多个线程分别用不同子类实例调同一同步方法 → 各自获取各自实例锁,不会相互阻塞
本质仍是对象级锁的基本规则
所谓“继承体系下的锁定行为”,只是对象锁机制在多态场景下的自然体现,并非特殊规则。
- 锁粒度始终是对象实例,不是类、方法签名或继承关系
- 同一个子类实例,无论从父类方法、子类方法还是同步块进入,所有
synchronized(this)都互斥 - 判断是否冲突,只需看是不是同一个对象(
==相等),与类型无关

















