为什么抛出并发修改异常以及如何调试它

我正在使用一个(JPA间接使用的一个,它就是这样发生的),但显然代码随机抛出一个.是什么原因导致它,我该如何解决这个问题?也许通过使用一些同步?CollectionHashMapConcurrentModificationException

下面是完整的堆栈跟踪:

Exception in thread "pool-1-thread-1" java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
        at java.util.HashMap$ValueIterator.next(Unknown Source)
        at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555)
        at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
        at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
        at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
        at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
        at org.hibernate.engine.Cascade.cascade(Cascade.java:130)

答案 1

这不是同步问题。如果正在迭代的基础集合被迭代器本身以外的任何内容修改,则会发生这种情况。

Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
    Entry item = it.next();
    map.remove(item.getKey());
}

这将在第二次调用时抛出一个。ConcurrentModificationExceptionit.hasNext()

正确的方法是

Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
    Entry item = it.next();
    it.remove();
}

假设此迭代器支持该操作。remove()


答案 2

尝试使用 a 而不是 plainConcurrentHashMapHashMap