synchronized 不会继承,子类重写父类同步方法时必须显式添加 synchronized 或使用 synchronized(this) 块,否则失去同步语义;Java 规范规定修饰符不参与继承,重写仅覆盖方法体,不传递并发控制。

不会自动带上。synchronized 不是可继承的修饰符,子类重写父类方法时,即使父类方法声明为 public synchronized void doWork(),子类方法默认不带同步语义,必须显式添加 synchronized 关键字或使用 synchronized(this) 块才能获得锁保护。
为什么 synchronized 不会继承
Java 语言规范明确要求:修饰符如 synchronized、static、final 等均不参与继承。重写只覆盖方法体和多态行为,不传递访问控制或并发控制语义。
- 父类方法加了
synchronized→ 锁的是调用该方法的对象实例(this) - 子类重写后没加
synchronized→ 方法变成非同步,多个线程可同时执行 - 若子类方法签名完全一致但漏掉
synchronized,编译器不会报错,也不会警告——这是常见并发隐患来源
子类如何正确保持同步语义
有三种等效方式,核心是确保锁对象仍是当前实例(this):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在子类方法声明上直接加
synchronized:public synchronized void doWork() { ... } - 在子类方法体内用
synchronized(this)包裹关键代码:public void doWork() { synchronized(this) { ... } } - 调用父类同步方法(前提是不重写,或重写后主动委托):
@Override public void doWork() { super.doWork(); }
多态调用下的锁归属很关键
即便用父类引用指向子类对象,只要实际调用的是父类定义的同步方法,锁的仍是那个子类实例:
立即学习“Java免费学习笔记(深入)”;
-
Parent p = new Child(); p.doWork();→ 若doWork()是父类中synchronized方法,则锁住的是Child实例 - 但如果
Child重写了doWork()且未加synchronized,则p.doWork()执行的是无锁版本,父类的同步性彻底失效 - 两个不同
Child实例各自调用各自的同步方法 → 各自持独立锁,互不阻塞
容易踩的坑
- 以为加了
@Override就自动同步 —— 注解只校验重写合法性,不传递synchronized - 子类方法加了
synchronized,但父类方法不是同步的 → 这是新增同步,与继承无关 - 误把
static synchronized当作实例锁 —— 它锁的是 Class 对象,和this完全不同 - 在构造器里调用被子类重写的同步方法 → 子类字段尚未初始化,可能引发 NPE 或状态不一致

















