2015-07-21 73 views
0

我想避免併發修改異常。所以試圖製作哈希映射的副本。即使這樣它會拋出併發修改,同時從原始地圖中刪除元素。以下是進行復制的代碼,是否有任何錯誤?處理併發修改異常android

private HashMap<String, ArrayList<String>> makeCopy(HashMap<String, ArrayList<String>> origMap) { 

    HashMap<String, ArrayList<String>> copy=new HashMap<String, ArrayList<String>>(); 
    Iterator<String> iterator = origMap.keySet().iterator(); 

    while(iterator.hasNext()) { 
     String key = iterator.next(); 
     copy.put(key, new ArrayList<String>(origMap.get(key))); 
    } 
    return copy; 
} 

或者是否有任何可能性在捕獲try catch塊後處理它?

創建新副本的目的: 實際上,1個Hashmap值副本應發送到另一個具有線程操作的活動(b),而原始副本將在調用其他活動的活動(A)中進行修改(b) ),那就是爲什麼試圖用不同的引用創建哈希映射的副本。

+0

嘗試'私人同步HashMap > makeCopy' –

回答

0

正如axierjhtjz所說的,正確的方法是讓迭代器修改集合。

或者使用ConcurrentHashMap。

一些好處: - >

,當你在你的項目需要非常高的併發您應該使用的ConcurrentHashMap。 線程安全,無需同步整個地圖。 使用鎖定完成寫入時,讀取速度可能會非常快。 在對象級別沒有鎖定。 在hashmap桶級別,鎖定的粒度更加精細。 如果一個線程嘗試修改而另一個線程正在迭代它,ConcurrentHashMap不會拋出ConcurrentModificationException。 ConcurrentHashMap使用多個鎖。

倒數第二個點是什麼可以幫到你:如果一個線程嘗試另一種就是遍歷它來修改它

的ConcurrentHashMap不會拋出ConcurrentModificationException。

詳細閱讀here

0

A 收集迭代時不能同時修改(添加/刪除)。您只能使用iterator.remove()刪除一個項目。否則會拋出ConcurrentModificationException

一個簡單的解決方案是,您可以使用簡單的for循環(不要使用Enhanced for循環)而不是迭代器。