我想避免并发修改异常。所以试图制作哈希映射的副本。即使这样,它也会在从原始地图中删除元素时抛出并发修改。下面是复制的代码,有没有错误?
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)中被修改,这就是为什么尝试创建一个哈希副本地图与不同的参考。
答案 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循环)而不是迭代器。