java.util.ConcurrentModificationException異常
阿新 • • 發佈:2018-12-14
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。