java - 为什么会抛出 ConcurrentModificationException 以及如何调试它

标签 java exception collections concurrentmodification

我正在使用 Collection (一个 HashMap 被 JPA 间接使用,它确实发生了),但显然代码随机抛出一个 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 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()手术。

关于java - 为什么会抛出 ConcurrentModificationException 以及如何调试它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68990562/

相关文章:

c++ - 如何在以下 C++ 代码中抛出异常

java - 一个例子来说明 Java 中不可修改集合的这一点?

collections - 添加来自不同实例的集合

java - 为什么 Eclipse 中的运行按钮不起作用?

java - 展平嵌套字符串数组

java - 抛出异常或返回值

java - 为什么 IllegalArgumentException (JDK 1.4.2) 不能用可抛出的原因构造?

java - java中空间和时间复杂度较低的panagram

java - Java 接口(interface)定义中的语句在什么上下文中执行?

java - 为什么 StdDraw 无论如何都不会被识别?