处理并发修改异常android

时间:2015-07-21 12:16:39

标签: android hashmap concurrentmodification

我想避免并发修改异常。所以试图制作哈希映射的副本。即使这样,它也会在从原始地图中删除元素时抛出并发修改。下面是复制的代码,有没有错误?

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块中捕获它后是否有可能处理它?<​​/ p>

创建新副本的目的: 实际上应该将一个Hashmap值的副本发送到另一个具有线程操作的活动(b),而原始副本将在调用另一个活动(b)的活动(A)中被修改,这就是为什么尝试创建一个哈希副本地图与不同的参考。

3 个答案:

答案 0 :(得分:0)

使用ConcurrentHashmap代替Hashmap或获取同步地图以读取值https://developer.android.com/reference/java/util/concurrent/ConcurrentHashMap.html

答案 1 :(得分:0)

正如axierjhtjz所说,正确的方法是只让迭代器修改集合。

或者使用ConcurrentHashMap。

一些好处: - &gt;

  

在项目中需要非常高的并发性时,应该使用ConcurrentHashMap。       没有同步整个地图是线程安全的。       使用锁完成写操作时,读操作可以非常快。       对象级别没有锁定。       在hashmap桶级别,锁定的粒度更精细。       如果一个线程尝试修改它而另一个线程迭代它,则ConcurrentHashMap不会抛出ConcurrentModificationException。       ConcurrentHashMap使用多种锁。

最后一点是可以帮助你的:

  

如果一个线程试图修改它而另一个线程迭代它,则ConcurrentHashMap不会抛出ConcurrentModificationException。

详细阅读here

答案 2 :(得分:0)

集合在迭代时无法同时修改(添加/删除)。您只能使用 iterator.remove()删除项目。否则会抛出 ConcurrentModificationException

一个简单的解决方案是你可以使用一个简单的for循环(不要使用Enhanced for循环)而不是迭代器。