You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

被synchronized修饰的方法,内部调用的子方法是否也需要同步?

Java synchronized修饰的方法内部调用的子方法是否需要加同步修饰?

首先明确核心前提:Java的synchronized是可重入锁,同一个线程已经获取到锁对象之后,再次调用同一锁对象保护的同步方法,不会出现锁阻塞,只会增加锁的重入计数,两种写法本身都不会触发语法错误或死锁,具体用哪种取决于业务场景。

场景1:仅父方法对外暴露,子方法不会被外部直接调用

如果childMethod1、childMethod2仅会被parentMethod内部调用,没有外部直接调用的场景(比如子方法声明为private私有),第一种写法完全正确:

// 仅父方法加synchronized即可
public synchronized void parentMethod() {
    childMethod1();
}

private void childMethod1() {
    childMethod2();
}

private void childMethod2() {
    
}

此时调用parentMethod时,当前线程已经持有了当前实例的对象锁,内部所有子方法的执行都在持有锁的线程中运行,天然有并发安全保障,子方法加synchronized属于冗余操作,只会增加无意义的重入计数开销。

场景2:子方法会被外部直接单独调用

如果childMethod1、childMethod2本身也是对外暴露的public方法,存在外部直接调用的场景,就必须使用第二种写法,给所有需要同步的方法都加synchronized:

// 所有对外暴露的同步方法都加synchronized
public synchronized void parentMethod() {
    childMethod1();
}

public synchronized void childMethod1() {
    childMethod2();
}

public synchronized void childMethod2() {
    
}

这种场景下如果不给子方法加同步修饰,外部多线程直接调用子方法时没有锁保护,就会出现并发安全问题。

注意边界

以上结论仅适用于所有方法锁的是同一个对象的场景:如果子方法属于其他类实例,或是静态同步方法(锁的是类对象而非实例对象),则需要单独评估锁的粒度和保护范围,不能直接套用上述规则。

内容的提问来源于stack exchange,提问作者zoro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 20:15:03