2011-12-28 31 views
0

我要尋找以下問題的解決方案:尋找解決方案來開發互斥

我設計包含一個地圖,它是由多個線程操作的Java類。這些線程將有操作包括:

  1. 迭代:會有一個線程迭代的地圖,而迭代,它會讀取和更新某些項的值
  2. 放:該線程將條目添加到之一地圖
  3. 得到:一個或多個線程會讀地圖定期

具有挑戰性的部分是,我不能把互斥體上的所有3種方法,因爲迭代將調用get和put,這將導致死鎖。

請告訴我如何設計類和互斥體使其工作。

感謝

+0

如果您不必使用互斥鎖(用於作業),則最好使用java.util.concurrent中的類,例如ConcurrentHashMap,它可以正確處理迭代器。 – toto2 2011-12-28 18:14:27

回答

1

的當您使用​​關鍵字時獲得的互斥體是可重入的,因此如果迭代已經擁有該互斥體,則在調用get和put時它可以重新獲得相同的值。

這就是說,我會創建您的地圖成員字段爲ConcurrentHashMap。然後,您的iterate將不會有ConcurrentModificationException問題(有關更多詳細信息,請參閱ConcurrentHashMap類的javadocs)。同樣鎖定getput將由ConcurrentHashMap爲您處理。

1

有更多的方式來皮膚貓,經典的一個是使用未受保護的專用的get/put方法從迭代,公共get/set方法包裝在一個互斥鎖