我使用的是Collection
(JPA间接使用的HashMap
,它确实发生了),但是显然随机代码抛出了ConcurrentModificationException
。是什么原因引起的,如何解决此问题?通过使用一些同步,也许吗?
这是完整的堆栈跟踪:
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)
最佳答案
这不是同步问题。如果要迭代的基础集合被Iterator本身以外的任何东西修改,则会发生这种情况。
Iterator it = map.entrySet().iterator();
while (it.hasNext())
{
Entry item = it.next();
map.remove(item.getKey());
}
第二次调用
ConcurrentModificationException
时,将抛出一个it.hasNext()
。正确的方法是
Iterator it = map.entrySet().iterator();
while (it.hasNext())
{
Entry item = it.next();
it.remove();
}
假设此迭代器支持
remove()
操作。
关于java - 为什么会引发ConcurrentModificationException以及如何对其进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57792737/