有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

同步Java同步方法调用非同步方法

我有这样的代码:

public class Example {
    public synchronized void doSomething() {
        // ...
        doSomethingElse();
        // ...
    }

    private void doSomethingElse() {
        // ...
    }
}

既然doSomething是唯一调用doSomethingElse并同步doSomething的地方,那么仍然需要使doSomethingElse同步吗

Java语言规范在beginning of chapter 8on类中说:“一个同步方法[…]在执行对象的主体之前自动锁定对象,并在返回时自动解锁对象”。我假设调用另一个方法不会返回,因此上面的代码应该是正确的

同步监视器上的JLS example 8.4.3.6-1似乎证实了我的理解

另一方面,我想使doSomethingElse同步不会有什么坏处;除了根据What is the synchronization cost of calling a synchronized method from a synchronized method?的一个小的性能影响(我不太关心这个;正确性更重要)

我错过什么了吗


共 (1) 个答案

  1. # 1 楼答案

    is it still necessary to make doSomethingElse synchronized?

    否。由于该方法是私有的,并且可以调用它的唯一上下文也是同步的,doSomethingElse不需要同步

    请注意,使doSomethingElse同步并没有什么坏处,原因有二:

    • 如果其他人更改了您的代码,从同步的其他位置调用doSomethingElse,您将是安全的。重新输入线程已经拥有的锁非常便宜,因此您不必担心性能后果
    • 当其他人阅读您的代码,并看到您在没有同步的情况下从doSomethingElse访问共享资源时,他们不会惊讶于您如何能够侥幸逃脱

    还要注意,两种方法都是非静态的,这一点很重要。如果doSomethingElsestatic并且需要访问可变静态资源,则需要将其与doSomething分开进行同步