ConcurrentModificationException

ConcurrentModificationException

我在后台线程中有下一个代码

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()中。
为什么会这样呢?我使用线程安全的集合并通过迭代器删除项目。仅在此线程中使用集合。

最佳答案

同步集合的线程安全性仅适用于一个方法调用。在方法调用之间,锁定被释放,另一个线程可以锁定该集合。如果执行两次操作,则在此期间可能会发生任何事情,除非您将其锁定为自己。例如

// to add two elements in a row, you must hold the lock.
synchronized(mAction) {
    mAction.add(x);
    // without holding the lock, anything could happen in between
    mAction.add(y);
}


与迭代同步集合类似,您必须持有锁,否则在迭代器的方法调用之间可能会发生任何事情。

synchronized (mAction) {
    for(Iterator<IStartAction> iter = mActions.iterator(); iter.hashNext();) {
        IStartAction action = iter.next();
        if (!action.isApplicable()) {
            iter.remove();
        }
    }
}

关于java - iterator.next()中的ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30062570/

10-12 02:17