【发布时间】:2020-08-13 17:50:25
【问题描述】:
我理解它背后的概念,但认为使用 ConcurrentHashMap 而不是 HashMap 可以解决它。因为 ConcurrentHashMap 可以防止不同线程的并发读取和修改。
但我仍然看到异常。
这是代码sn-p-
SampleFile.java
prepareInfo(RequestHelper.getSender(request), someVar, concurrentMap);
....
...
private void prepareInfo(final Sender sender, final SomeVar someVar, final ConcurrentHashMap<String,
Object> concurrentMap){
final Info info = RequestHelper.getInfo(someVar);
someVar.setInfo(info);
if(sender != null){
prepareProfileInfo(sender.getUserDetails(), info, concurrentMap);
mapDetailsWithMap(sender.getDetails(), concurrentMap);
if(sender.getSenderId() != null){
concurrentMap.put("sender_id", sender.getSenderId());
}
concurrentMap.putAll(sender.getAdditionalProperties());
}
}
错误堆栈跟踪是 -
at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
at java.util.HashMap$EntryIterator.next(HashMap.java:1479)
at java.util.HashMap$EntryIterator.next(HashMap.java:1477)
at java.util.concurrent.ConcurrentHashMap.putAll(ConcurrentHashMap.java:1083)
at SampleFile.prepareAccountInfo(SampleFile.java:114)
几个我不清楚的问题-
- 为什么异常仍然发生?
- 我们可以通过单元测试来测试修复吗?
【问题讨论】:
标签: java collections iteration concurrenthashmap concurrentmodification