【发布时间】:2015-05-05 20:22:40
【问题描述】:
我在后台线程中有下一个代码
private List<IStartAction> mActions = Collections.synchronizedList(new ArrayList<IStartAction>());
protected void removeNonApplicableActions() {
Iterator<IStartAction> iterator = mActions.iterator();
while (iterator.hasNext()) {
IStartAction action = iterator.next();
if (!action.isApplicable()) {
iterator.remove();
}
}
}
当我在主线程中运行它时,会将 ConcurrentModificationException 放入 iterator.next()。 为什么会这样?我使用线程安全的集合并通过迭代器删除项目。仅在此线程中使用的集合。
【问题讨论】:
-
同步表示在特定条件下可以在1个以上的线程中修改列表(请参阅javadoc的synchronizedList()方法)。这是一个不同的问题,您同时迭代和删除。请使用 listIterator 而不是普通的迭代器。使用 listIterator() 方法。
-
您能否提供一个代码的最小工作示例,以便我们重现该问题?
-
ConcurrentModificationException并不是必然表示您有多个线程在修改您的列表,而是您同时在遍历您的列表并同时对其进行修改。跨度> -
这看起来很奇怪/有问题。请 MCVE。
-
isApplicable()是做什么的?它是否以任何方式修改mActions?
标签: java multithreading java.util.concurrent