我有这样的代码:Java的同步方法调用不同步方法
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?(我不关心这么多;正确性更重要)的小性能命中。
我错过了什么吗?
除了这样一个事实,即从外部可见的对象上同步并不是一个很好的做法,代码就很好。 – biziclop 2014-10-29 16:29:10
@biziclop您能否详细说明为什么同步可见(即公共)功能是不好的做法?任何参考? – user949300 2014-10-29 16:32:38
@ user949300不可见的函数,对可见对象进行同步是问题所在。 (就你而言,你在'this'上同步)。问题是,如果你创建一个对象并将它传递给一些未知的代码('Example ex = new Example(); foo.doSomethingWith(ex)'),那么代码也可以在'ex'上同步,从而干扰你的同步。 – biziclop 2014-10-29 16:35:09