問題:當顯示器已被鎖定時,重新進入同步塊的開銷是多少?重新進入同步塊的開銷
例如:
Object lock;
void outer()
{
synchronized (lock)
{
innerOne();
innerTwo();
}
}
void innerOne() { synchronized (lock) { /* ... */ } }
void innerTwo() { synchronized (lock) { /* ... */ } }
的上述意圖是innerOne
和innerTwo
而線程上lock
同步總是調用。
如果存在不可忽略的成本,是否有任何方法可以調用以放入assert
聲明?我能找到的最接近的電話號碼是lock.notify()
,以及IllegalMonitorStateException
,例如
boolean isMonitorHeld(final Object object)
{
try { object.notify(); return true }
catch (final IllegalMonitorStateException e) { return false; }
}
哪想被使用:
void innerOne() { assert isMonitorHeld(lock); /* ... */ }
有沒有對兩個選項的樣式任何意見或任何替代方案?
編輯
我希望更全面的答案不僅僅是「時間,看看」。我沒有能力預見我的代碼可能遇到的所有潛在情況,然後創建一個測試來展示這些情況。我想了解同步機制如何工作以瞭解它在不同情況下如何執行。我知道同步可能在不同的平臺上以不同的方式實現。在哪種情況下有所不同(主要在Solaris和Linux操作系統上)?
直覺上,我不認爲重新進入同步塊會有明顯的成本,因爲我發現的大多數文章都暗示無連鎖鎖是便宜的。但是,在這些方法中添加同步塊並不合適,因爲它給人的印象是它們可以被稱爲,而不是首先在鎖上同步。斷言提供了一個更好的想法,但它看起來像一個相當醜陋的黑客。我想知道是否有一個很好的理由,沒有一個更合理的選擇。
你爲什麼不測量它?如果你*不能測量差異,那麼就沒有差別。 – skaffman 2012-02-10 09:47:53