synchronized修饰的方法不具有继承性,子类重写时必须显式添加synchronized才能保证同步;父类同步方法可被子类安全调用并支持锁重入;静态同步方法因锁对象不同(parent.class与child.class)不互斥。

synchronized修饰的方法本身不具有继承性,子类重写时不会自动保留同步语义,但父类的同步方法仍可被子类安全调用——关键在于“是否显式加锁”和“是否复用同一锁对象”。
子类重写父类synchronized方法,默认失去同步效果
即使父类方法用了synchronized,子类覆盖该方法时若没加synchronized关键字,该重写方法就不是同步的。JVM不会自动继承access_flags中的ACC_SYNCHRONIZED标志。
- 父类方法加了synchronized → 编译后字节码含ACC_SYNCHRONIZED标记
- 子类重写该方法 → 新方法是独立符号,除非手动加synchronized,否则无此标记
- 结果:多个线程调用子类重写后的方法,不会互斥,可能引发线程安全问题
子类可直接调用父类的synchronized方法,且支持锁重入
子类实例方法中调用super.xxx()或直接继承未重写的方法,只要目标方法本身是synchronized,就会正常获取锁;同一线程再次进入父类同步方法时,因可重入特性不会阻塞。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 锁对象仍是当前this(非静态方法)或Class对象(静态方法)
- 例如:子类synchronized方法内调用super.syncMethod() → 同一对象锁可重复获取
- 本质是monitor计数器+1,退出时-1,归零才真正释放锁
子类想保持同步,必须显式加synchronized
要让重写后的方法具备同步能力,必须在子类方法声明中明确写出synchronized,不能依赖父类修饰。
- 可以是synchronized实例方法、static synchronized静态方法,或synchronized(this)代码块
- 若用synchronized(this),需确保锁对象一致(比如都用this,而非新建Object)
- 注意:synchronized修饰符不属于方法签名,不参与重写判定,只影响运行时行为
静态同步方法的继承与重写更需谨慎
static synchronized方法锁的是Class对象,子类重写时即使加了static synchronized,锁对象也变成子类的Class,与父类不同 —— 这意味着父子类静态同步方法之间不构成互斥。
- Parent.class 和 Child.class 是两个不同的锁对象
- 所以 Parent.staticSync() 和 Child.staticSync() 可并发执行
- 如需跨类统一控制,应显式使用同一Class对象(如 synchronized(Parent.class))或自定义静态锁对象
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










