繁体   English   中英

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

[英]Java synchronized method calling not synchronized method

我有这样的代码:

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

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

由于doSomething是唯一调用doSomething并同步doSomethingElse地方,是否仍需要使doSomethingElse同步?

Java语言规范在关于类的第8章开头说:“同步方法在执行对象主体之前自动锁定对象,并在返回对象时自动解锁对象”。 我假设调用另一个方法没有返回,因此上面的代码应该是正确的。

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

另一方面,我想使doSomethingElse同步不会有什么坏处。 除了可能会降低性能之外, 从同步方法中调用同步方法的同步成本是多少? (我不太在乎;正确性更重要)。

我想念什么吗?

是否仍然需要使doSomethingElse同步?

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

请注意,使doSomethingElse同步不会有什么坏处,这有两个原因:

  • 如果有人将您的代码更改为从其他同步的地方调用doSomethingElse ,那么您会很安全。 重新输入线程已经拥有的锁非常便宜,因此您不必担心性能问题。
  • 当其他人阅读您的代码,并看到您不同步地从doSomethingElse访问共享资源时,他们对您如何摆脱这些感到惊讶。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM