繁体   English   中英

处理并发修改异常android

[英]Handling Concurrent Modification Exception 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块中捕获它之后,是否有可能处理它?

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

使用ConcurrentHashmap而不是Hashmap或获取用于读取值的同步映射https://developer.android.com/reference/java/util/concurrent/ConcurrentHashMap.html

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

或者使用ConcurrentHashMap。

一些好处:->

当项目中需要很高的并发时,应使用ConcurrentHashMap。 它是线程安全的,无需同步整个映射。 用锁完成写操作时,读操作可能会非常快。 在对象级别没有锁定。 在哈希图存储桶级别,锁定的粒度要精细得多。 如果一个线程尝试修改它,而另一个线程对其进行迭代,则ConcurrentHashMap不会引发ConcurrentModificationException。 ConcurrentHashMap使用多个锁。

第二点是什么可以帮助您:

如果一个线程尝试修改它,而另一个线程对其进行迭代,则ConcurrentHashMap不会引发ConcurrentModificationException。

这里详细阅读。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM