同步Java同步方法调用非同步方法
我有这样的代码:
public class Example {
public synchronized void doSomething() {
// ...
doSomethingElse();
// ...
}
private void doSomethingElse() {
// ...
}
}
既然doSomething
是唯一调用doSomethingElse
并同步doSomething
的地方,那么仍然需要使doSomethingElse
同步吗
Java语言规范在beginning of chapter 8on类中说:“一个同步方法[…]在执行对象的主体之前自动锁定对象,并在返回时自动解锁对象”。我假设调用另一个方法不会返回,因此上面的代码应该是正确的
同步监视器上的JLS example 8.4.3.6-1似乎证实了我的理解
另一方面,我想使doSomethingElse
同步不会有什么坏处;除了根据What is the synchronization cost of calling a synchronized method from a synchronized method?的一个小的性能影响(我不太关心这个;正确性更重要)
我错过什么了吗
# 1 楼答案
否。由于该方法是私有的,并且可以调用它的唯一上下文也是同步的,
doSomethingElse
不需要同步请注意,使
doSomethingElse
同步并没有什么坏处,原因有二:doSomethingElse
,您将是安全的。重新输入线程已经拥有的锁非常便宜,因此您不必担心性能后果李>doSomethingElse
访问共享资源时,他们不会惊讶于您如何能够侥幸逃脱李>还要注意,两种方法都是非静态的,这一点很重要。如果
doSomethingElse
是static
并且需要访问可变静态资源,则需要将其与doSomething
分开进行同步