使用另一个HashMap进行初始化时出现HashMap ConcurrentModificationException

时间:2016-11-08 15:57:06

标签: java android hashmap concurrenthashmap concurrentmodification

在多线程代码中,我在第3行看到了ConcurrentModificationException

line 1:   Map<String, String> attributMap = new HashMap<>();
line 2:   if(attributeMap.size() > 0)
line 3:       tagMyEvent(new HashMap<>(attributeMap));

java.util.ConcurrentModificationException
    1   at java.util.HashMap$HashIterator.nextEntry(HashMap.java:851)
    2   at java.util.HashMap$EntryIterator.next(HashMap.java:891)
    3   at java.util.HashMap$EntryIterator.next(HashMap.java:890)
    4   at java.util.HashMap.putAllForCreate(HashMap.java:485)
    5   at java.util.HashMap.<init>(HashMap.java:257)
!   6   at tagMyEvent (test.java:line 3)  

我猜错的唯一原因是:

    正在创建新的HashMap&lt;&gt;(attributMap)时,正在修改
  • attributMap。

将上述代码改为此,解决问题:

line 1:   Map<String, String> attributMap = new HashMap<>();
line 2:   if(attributeMap.size() > 0)
line 3:       tagMyEvent(new ConcurrentHashMap<>(attributeMap));

OR

line 1:   Map<String, String> attributMap = new ConcurrentHashMap<>();
line 2:   if(attributeMap.size() > 0)
line 3:       tagMyEvent(new ConcurrentHashMap<>(attributeMap));

如果没有,有人可以提出解决方案,或者说明究竟是什么导致了这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果有的话,“attributeMap”是需要并发的那个 - 因为如果它只是一个常规的HashMap,它仍然会拒绝在“新的ConcurrentHashMap”内部进行迭代,而我们什么也没有实现...... < / p>

那就是说,我也建议

  1. 考虑ConcurrentHashMap是否真的足以满足您的需求,这取决于您在其上运行的其他操作,以及线程之间的合作程度,或者他们应该立即看到彼此的变化......
  2. 我假设我们只看到了一个部分代码片段(显然你没有在一个方法中本地初始化“attributeMap”,因为那样就没有并发问题)。因此,请考虑测试其他问题 - 例如如果完整的代码做了一些额外的操作,为了简单起见,这篇文章中省略了请记住,即使您只有一个线程,某些操作也可能产生ConcurrentModificationException ...