Java synchronized方法调用非同步方法

时间:2014-10-29 16:25:32

标签: java synchronization

我有这样的代码:

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

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

由于doSomethingdoSomethingElse被调用且同步doSomething的唯一位置,是否仍需要使doSomethingElse同步?

Java语言规范在类beginning of chapter 8中说:"同步方法[...]在执行其主体之前自动锁定对象,并在返回时自动解锁对象"。我假设调用另一个方法没有返回,所以上面的代码应该是正确的。

同步监视器上的

JLS example 8.4.3.6-1似乎证实了我的理解。

另一方面,我认为让doSomethingElse同步不会受到伤害;除了可能因What is the synchronization cost of calling a synchronized method from a synchronized method?而导致的性能下降(我不太关心;正确性更重要)。

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

  

是否仍需要doSomethingElse同步?

没有。由于该方法是私有的,并且同步的唯一上下文也是同步的,因此doSomethingElse不需要同步。

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

  • 如果其他人更改了您的代码,以便从同步的其他地方调用doSomethingElse,那么您将是安全的。重新输入线程已经拥有的锁是非常便宜的,所以你不必担心性能后果。
  • 当其他人阅读您的代码,并看到您在没有同步的情况下从doSomethingElse访问共享资源时,他们对您如何逃避这一点并不感到惊讶。

另请注意,两种方法都是非静态非常重要。如果doSomethingElsestatic且需要访问可变静态资源,则需要将其与doSomething分开同步。