gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:19:43 25 4
gpt4 key购买 nike

我有这样的代码:

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

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

既然 doSomething 是唯一调用 doSomethingElse 并且 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? 的小性能影响外(我不太关心;正确性更重要)。

我错过了什么吗?

最佳答案

is it still necessary to make doSomethingElse synchronized?

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

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

  • 如果其他人更改您的代码以从其他同步的地方调用doSomethingElse,您将是安全的。重新进入线程已拥有的锁的成本非常低,因此您无需担心性能后果。
  • 当其他人阅读您的代码并看到您在未同步的情况下从 doSomethingElse 访问共享资源时,他们不会对您如何侥幸逃脱感到惊讶。

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

关于Java同步方法调用非同步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26635693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com