我們使用的代碼在代碼片段周圍使用syncronized塊,並使用大量wait和notifyAll()調用。我們試圖將這些轉換爲使用Java 5 Lock.lock()和Lock.unlock()方法。如何遷移此代碼以刪除所有wait和notifyAll調用。我不知道這些使用新的鎖定功能的等同物。轉換wait&notifyAll代碼以使用Java 1.5 Lock對象
任何與例子的鏈接將不勝感激。
由於提前
當量,需要下面的代碼被轉換爲使用Lock.lock()和lock.unlock第一部分以除去同步塊是簡單,因爲我只需要調用鎖( ) 方法。問題是可以爲notifyAll()和wait方法做些什麼。
synchronized(LOCK) { while(!Thread.interrupted()) { try { working = runRules(); if(!working) LOCK.notifyAll(); LOCK.wait(working ? shortTimeout : longTimeout); } catch(final InterruptedException e) { Package.log.info("Thread was interrupted. Exiting.", e); return; } } }
如果你可以發佈代碼示例,你會得到更好的結果 - 在1.5中有很多併發基元。在例子之外給你的建議可能會給你錯誤的答案。 – 2011-05-03 20:47:16
感謝您的回覆。我已添加您要求的代碼段。 – Nadeem 2011-05-03 21:26:27
'ReentrantLock'比'synchronized'塊更容易出錯 - 很容易錯過'finally'塊。所以,除非你需要一些特殊的功能 - lockInterruptibly或tryLock - 否則轉換代碼沒有意義。如果您決定將代碼遷移到更新的API中,則應考慮重構代碼以使用更高級別的API,如信號量,鎖存器或障礙。 – 2011-05-03 22:46:40