问题描述
当循环访问来自 WebLogic 中的 JPA 查询的 List
时,只要遍历此列表,应用程序就会抛出一个 ConcurrentModificationException
。
Caused By: java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
(rest of stack trace omitted)
伪代码如下:
final List<SomeEntity> someEntities = someEntityDao.getAllMatchingSomeCriteria();
for (final SomeEntity someEntity : someEntities ) {
// ...
}
请务必注意,列表 someEntities
未以任何方式、形状或形式被代码修改。相反,我得出的结论是,WebLogic 仍在一个单独的线程中填充列表,而主线程已经在遍历它。
可以这样解决:
final List<SomeEntity> someEntities = new ArrayList<>(someEntityDao.getAllMatchingSomeCriteria());
for (final SomeEntity someEntity : someEntities ) {
// ...
}
但这意味着必须完成所有代码,这是最后的手段。有没有办法让 WebLogic 停止尝试变得聪明?
解决方法
可能无法对同时发生变化的集合进行迭代,而不受迭代器的影响。