【发布时间】:2023-04-06 06:37:02
【问题描述】:
我不知道为什么在迭代 ArrayList 时会发生 ConcurrentModificationException。 ArrayList 是方法范围的,因此执行相同代码的其他线程不应该看到它。至少如果我正确理解了多线程和变量范围的话。
Caused by: java.util.ConcurrentModificationException
at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:64)
at com....StrategyHandler.applyStrategy(StrategyHandler.java:184)
private List<Order> applyStrategy(StorageObjectTree storageObjectTree) {
...
List<OrderHeader> finalList = new ArrayList<Order>();
for (StorageObject storageObject : storageObjectTree.getStorageObjects()) {
List<Order> currentOrders = strategy.process(storageObject);
...
if (currentOrders != null) {
Iterator<Order> iterator = currentOrders.iterator();
while (iterator.hasNext()) {
Order order = (Order) iterator.next(); // line 64
// read some values from order
}
finalList.addAll(currentOrders);
}
}
return finalList;
}
谁能告诉我问题的根源是什么?
【问题讨论】:
-
@newbieee:虽然演员阵容是不必要的,但这不是问题的原因。
-
您没有添加或删除 currentOrders 的任何值,对吧?
-
您需要在此处粘贴更多代码,您正在修改 currentOrders。
-
您是否有任何其他线程可能正在访问由 strategy.process() 方法返回的 currentOrders 列表?
-
在迭代之前尝试复制到 ArrayList - 不是解决方案,但可能有助于定位问题
List<Order> currentOrders = new ArrayList<>(strategy.process(storageObject));
标签: java arraylist concurrentmodification