我有这样的代码:
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同步不会有什么害处;除了按照从同步方法调用同步方法的同步成本是多少? (我不太关心这个问题;正确性更重要)的小性能影响之外。
我是不是遗漏了什么?
发布于 2014-10-29 16:28:13
是否仍有必要使
doSomethingElse同步?
不是的。由于该方法是私有的,并且可以调用它的唯一上下文也是同步的,所以不需要同步doSomethingElse。
请注意,使doSomethingElse同步并不有害,原因有二:
doSomethingElse,您将是安全的。重新输入线程已经拥有的锁非常便宜,因此您不需要担心性能后果。doSomethingElse访问共享资源时,他们并不惊讶您如何才能这样做。还要注意,这两种方法都是非静态的,这一点很重要。如果doSomethingElse是static,并且需要访问可变的静态资源,则需要将其与doSomething分开同步。
https://stackoverflow.com/questions/26635693
复制相似问题