[英]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.