首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用非同步方法的Java同步方法

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

Stack Overflow用户
提问于 2014-10-29 16:25:31
回答 1查看 1.2K关注 0票数 2

我有这样的代码:

代码语言:javascript
复制
public class Example {
    public synchronized void doSomething() {
        // ...
        doSomethingElse();
        // ...
    }

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

由于doSomething是调用doSomethingElse和同步doSomething的唯一地方,那么是否仍有必要使doSomethingElse同步?

Java规范在第8章开头 on类中说:“同步方法.在执行对象主体之前自动锁定对象,并在返回时自动解锁对象”。我假设调用另一个方法不会返回,所以上面的代码应该是正确的。

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

另一方面,我猜使doSomethingElse同步不会有什么害处;除了按照从同步方法调用同步方法的同步成本是多少? (我不太关心这个问题;正确性更重要)的小性能影响之外。

我是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-29 16:28:13

是否仍有必要使doSomethingElse同步?

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

请注意,使doSomethingElse同步并不有害,原因有二:

  • 如果其他人更改您的代码以从其他不同步的地方调用doSomethingElse,您将是安全的。重新输入线程已经拥有的锁非常便宜,因此您不需要担心性能后果。
  • 当其他人阅读您的代码,并看到您在没有同步的情况下从doSomethingElse访问共享资源时,他们并不惊讶您如何才能这样做。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26635693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档