使用 Set 时出现 ConcurentModificationException
ConcurentModificationException when using Set
运行时指示在给定 temp = keysit.next() 时发生异常。我认为当我第二次重新定义 keysit = keys.iterator() 时已经解决了这个问题,但也许我错过了重点。有什么建议吗?
Map<Integer, Set<String>> lhm = new LinkedHashMap<Integer, Set<String>>();
public void sortMap() {
Set<Integer> keys = hm.keySet();
Iterator<Integer> keysit;
int iterations = keys.size();
int smallest;
int temp;
for(int i=0; i<iterations; i++) {
keysit = keys.iterator();
smallest = keysit.next();
keysit = keys.iterator();
while(keysit.hasNext()) {
temp = keysit.next();
if(temp<smallest)
smallest = temp;
lhm.put(smallest, lhm.get(smallest));
keys.remove(smallest);
}
}
System.out.println(lhm);
}
使用 Concurrenthashmap 而不是 hashmap 或 map bcoz hashmap 不是线程安全的
重点是迭代器维护一个名为 - modCount 的整数标志,它在迭代期间跟踪修改。
在下面的代码行中
keys.remove(smallest);
您实际上是从集合中删除元素,这会更改此 modcount。因此下次调用 next() 获取下一个元素时,它会检查 modcount 值是否已更改。如果是则抛出并发修改异常。
所以总而言之,修改取决于 modcount 标志,而不取决于您重新定义了多少次 keys.iterator()。
一个好的选择是按照@Olu
的建议使用 ConcurrentHashMap
运行时指示在给定 temp = keysit.next() 时发生异常。我认为当我第二次重新定义 keysit = keys.iterator() 时已经解决了这个问题,但也许我错过了重点。有什么建议吗?
Map<Integer, Set<String>> lhm = new LinkedHashMap<Integer, Set<String>>();
public void sortMap() {
Set<Integer> keys = hm.keySet();
Iterator<Integer> keysit;
int iterations = keys.size();
int smallest;
int temp;
for(int i=0; i<iterations; i++) {
keysit = keys.iterator();
smallest = keysit.next();
keysit = keys.iterator();
while(keysit.hasNext()) {
temp = keysit.next();
if(temp<smallest)
smallest = temp;
lhm.put(smallest, lhm.get(smallest));
keys.remove(smallest);
}
}
System.out.println(lhm);
}
使用 Concurrenthashmap 而不是 hashmap 或 map bcoz hashmap 不是线程安全的
重点是迭代器维护一个名为 - modCount 的整数标志,它在迭代期间跟踪修改。
在下面的代码行中
keys.remove(smallest);
您实际上是从集合中删除元素,这会更改此 modcount。因此下次调用 next() 获取下一个元素时,它会检查 modcount 值是否已更改。如果是则抛出并发修改异常。
所以总而言之,修改取决于 modcount 标志,而不取决于您重新定义了多少次 keys.iterator()。
一个好的选择是按照@Olu
的建议使用 ConcurrentHashMap