synchronized 不继承,子类调用未重写的父类同步方法时仍受锁保护;重写后未加 synchronized 则失去同步;显式添加后锁 this,支持 super 调用重入;静态同步方法不被继承,父类与子类静态方法锁各自 Class 对象。

synchronized 在抽象父类和子类之间不自动传递,但同步行为完全取决于运行时实际调用的对象和方法是否被显式加锁。关键不是“继承关系”,而是“锁对象”和“方法体是否带 synchronized 修饰”。
抽象父类定义同步方法,子类未重写
如果抽象父类声明了 synchronized 实例方法,而子类没有重写它,那么子类实例调用该方法时,锁的是该子类实例本身(即 this)。JVM 按照常规 monitor 锁逻辑执行:同一对象上多个线程串行进入,其他线程阻塞等待。
- 锁目标是运行时对象,不是类声明位置
- 即使父类是 abstract,只要方法有具体实现且加了 synchronized,子类继承后直接调用就受锁保护
子类重写父类同步方法但没加 synchronized
子类覆盖了父类的 synchronized 方法,但新方法体未加 synchronized —— 此时该方法完全失去同步语义,变成普通非同步方法。多线程可并发执行,不互斥。
- synchronized 是方法修饰符,不参与继承;子类重写即重新定义,原修饰符不保留
- 若需同步,必须在子类方法签名中显式加上 synchronized
子类重写并显式添加 synchronized
子类方法加上 synchronized 后,锁目标仍是当前子类实例(this),与父类无关。此时若在子类方法内调用 super.xxx()(父类同步方法),属于同一线程对同一对象锁的重入,不会死锁,符合可重入锁特性。
立即学习“Java免费学习笔记(深入)”;
- 锁对象始终是 this,无论 super 调用多少层同步方法
- 适合需要扩展逻辑但仍保持同步粒度的场景
静态同步方法在抽象类中的表现
抽象类中定义 public static synchronized 方法,子类无法“继承并调用”该静态方法作为自己的静态方法(除非通过父类名调用)。若子类定义同签名静态方法,则是独立方法,锁的是子类的 Class 对象,与父类 Class 锁无关。
- 抽象类的静态同步方法只能通过 AbstractClass.method() 方式调用,锁 AbstractClass.class
- 子类写同名静态方法,属于新方法,锁 SubClass.class,两者无竞争关系


















