我有這樣的代碼: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