簡體   English   中英

iterator.next()中的ConcurrentModificationException

[英]ConcurrentModificationException in iterator.next()

我在后台線程中有下一個代碼

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();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM