通过集合进行迭代期间发生ConcurrentModificationException

时间:2019-06-19 07:19:15

标签: java stream spring-batch concurrentmodification

我正在spring-batch应用程序的ItemProcessor中遍历一个列表,但出现此错误:

java.util.ConcurrentModificationException: null

当我将批处理配置设置为使用单个线程时,它可以正常工作。我正在使用SimpleAsyncTaskExecutor。客户是一个实体,并且具有客户别名列表。

private void fillCustomer(final Customer customer, final ExtractLine result){

CustomerAlias customerAlias = customer.getCustomerAlias().stream().filter(s -> s.getAliasType().isAster()).findFirst().orElse(nullAlias);
result.setCustomer(customerAlias.getCalNmeAliasName());
}


java.util.ConcurrentModificationException: null
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at org.hibernate.collection.internal.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:815)
at java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812)
at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
at com.liq.sub.impl.MyProcessor.fillCustomer(MyProcessor.java:107)

1 个答案:

答案 0 :(得分:5)

  

当我将批处理配置设置为使用单个线程时,它工作正常。

然后答案很简单:当前有其他线程正在迭代该集合。

现在,您需要退后一步,并确定在此代码运行时可能会在源代码中的何处修改集合。

没有“魔术”可以帮助避免这种情况。