synchronized锁不继承,但锁对象是运行时实例;子类调用未重写的父类同步方法时锁该子类实例,重写后未加synchronized则无锁,显式添加后锁仍为子类实例,静态同步方法锁对应class对象。

synchronized 锁在父子类继承中不会自动传递,但锁的行为依然严格遵循“对象锁”本质——即锁的是运行时的实际对象实例,而不是方法签名或继承关系。
父类同步方法被子类直接调用(未重写)
子类对象调用继承来的 synchronized 实例方法时,锁的是该子类实例本身。JVM 会正常获取该对象的 monitor 锁,其他线程若试图调用同一对象的任何 synchronized 方法(无论定义在父类还是子类),都会被阻塞。
- 例如:
Sub1 extends Super,且未重写testMothed(),那么new Sub1().testMothed()仍以该Sub1实例为锁目标 - 多个线程并发调用同一个
Sub1实例的该方法,会串行执行
子类重写父类同步方法但未加 synchronized
重写后的方法失去同步语义,即使父类原方法是 synchronized,子类版本默认是普通方法,不持有对象锁。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:
Sub2重写了testMothed()但没加synchronized,则多线程调用该子类实例的此方法将完全异步执行 - 这印证了“synchronized 不可继承”:修饰符不参与继承,仅作用于被修饰的具体方法体
子类重写并显式添加 synchronized
子类可自主决定是否加锁,加了就恢复同步行为;此时锁目标仍是当前子类实例,与父类无关。
- 锁重入仍有效:若子类同步方法内部调用父类的同步方法(如
super.testMothed()),不会发生死锁,因为是同一对象锁的重复获取 - 这是 synchronized 支持继承环境的关键机制,但前提是子类主动声明 synchronized
静态同步方法的继承表现
静态方法属于类,其锁是 Class 对象。子类继承父类静态同步方法时,调用的是父类的 Class 锁;若子类定义同名静态方法,则属于新方法,锁的是子类的 Class 对象。
- 父类
public static synchronized void m()被子类继承,调用时锁的是Super.class - 子类若定义自己的
public static synchronized void m(),则锁的是Sub.class,与父类锁无关
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










