1. 程式人生 > >java.util.ConcurrentModificationException異常

java.util.ConcurrentModificationException異常

ArrayList的remove()方法:會導致list的modCount加一,從而跟iterator的expectedModCount和不一致,丟擲異常:

final void checkForComodification() {
    if (modCount != expectedModCount)
    throw new ConcurrentModificationException();
}

注意,像使用for-each進行迭代實際上也會出現這種問題。

而Itr類的的remove()方法,多了一句:

expectedModCount = modCount;  所以不會報錯。

也就是說,在迭代時,只能用迭代器的remove()。

public void remove() {
    if (lastRet == -1)
    throw new IllegalStateException();
       checkForComodification();
 
    try {
    AbstractList.this.remove(lastRet);
    if (lastRet < cursor)
        cursor--;
    lastRet = -1;
    expectedModCount = modCount;
    } catch (IndexOutOfBoundsException e) {
    throw new ConcurrentModificationException();
    }
}

那麼,在多執行緒環境下,我們如何應對這個問題呢?

1)在使用iterator迭代的時候使用synchronized或者Lock進行同步;

      2)使用併發容器CopyOnWriteArrayList代替ArrayList和Vector。