我要尋找以下問題的解決方案:尋找解決方案來開發互斥
我設計包含一個地圖,它是由多個線程操作的Java類。這些線程將有操作包括:
- 迭代:會有一個線程迭代的地圖,而迭代,它會讀取和更新某些項的值
- 放:該線程將條目添加到之一地圖
- 得到:一個或多個線程會讀地圖定期
具有挑戰性的部分是,我不能把互斥體上的所有3種方法,因爲迭代將調用get和put,這將導致死鎖。
請告訴我如何設計類和互斥體使其工作。
感謝
我要尋找以下問題的解決方案:尋找解決方案來開發互斥
我設計包含一個地圖,它是由多個線程操作的Java類。這些線程將有操作包括:
具有挑戰性的部分是,我不能把互斥體上的所有3種方法,因爲迭代將調用get和put,這將導致死鎖。
請告訴我如何設計類和互斥體使其工作。
感謝
的當您使用關鍵字時獲得的互斥體是可重入的,因此如果迭代已經擁有該互斥體,則在調用get和put時它可以重新獲得相同的值。
這就是說,我會創建您的地圖成員字段爲ConcurrentHashMap
。然後,您的iterate
將不會有ConcurrentModificationException
問題(有關更多詳細信息,請參閱ConcurrentHashMap
類的javadocs)。同樣鎖定get
和put
將由ConcurrentHashMap
爲您處理。
有更多的方式來皮膚貓,經典的一個是使用未受保護的專用的get/put方法從迭代,公共get/set方法包裝在一個互斥鎖
如果您不必使用互斥鎖(用於作業),則最好使用java.util.concurrent中的類,例如ConcurrentHashMap,它可以正確處理迭代器。 – toto2 2011-12-28 18:14:27