【发布时间】:2016-11-08 15:57:06
【问题描述】:
在多线程代码中,我在第 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(attributMap) 时正在修改 attributMap。
将上面的代码改成这个,解决问题:
line 1: Map<String, String> attributMap = new HashMap<>();
line 2: if(attributeMap.size() > 0)
line 3: tagMyEvent(new ConcurrentHashMap<>(attributeMap));
或
line 1: Map<String, String> attributMap = new ConcurrentHashMap<>();
line 2: if(attributeMap.size() > 0)
line 3: tagMyEvent(new ConcurrentHashMap<>(attributeMap));
如果没有,有人可以提出解决方案或阐明究竟是什么导致了这个问题。
提前致谢。
【问题讨论】:
-
如果有的话,你需要你的“attributeMap”是一个需要并发的——因为如果它只是一个普通的HashMap,它仍然会在“new ConcurrentHashMap”中被迭代,我们已经一无所获...
标签: java android hashmap concurrenthashmap concurrentmodification