我正在使用Collection(HashMapJPA间接使用的a ,它确实发生了),但是显然代码是随机抛出的ConcurrentModificationException。是什么原因引起的,如何解决此问题?通过使用一些同步,也许吗?
Collection
HashMapJPA
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()); }
第二次调用it.hasNext()时,将抛出ConcurrentModificationException。
it.hasNext()
正确的方法是
Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Entry item = it.next(); it.remove(); }
假设此迭代器支持remove()操作。
remove()