迭代器的并发修改异常

时间:2014-02-16 05:00:05

标签: java exception iterator

我只是对我正在做的一个程序有一个普遍的问题。

我有一个链表,其中一个实例变量是一个版本int,以确保没有并发修改例外。

如果我在链表中​​添加一个元素,那么我会更改版本。

我还使用了一个自定义迭代器,它遍历链表,该链表也有自己的版本。创建linkedList迭代器时,它将迭代器的版本设置为等于linkedList的版本。

我的问题是: 如果我用Iterator删除一个元素,我也应该更改迭代器版本吗?

基本上Iterator类中的每个方法都首先检查以确保版本是相同的,如果不是,它会抛出一个新的并发修改异常。

迭代器是否更改列表是否重要?

1 个答案:

答案 0 :(得分:0)

  

我的问题是:如果我用Iterator删除一个元素,我是否应该更改迭代器版本?

是的,通常您也应该更改Iterator的版本,只要您想允许Iterator修改列表即可。否则你应该抛出一个java.lang.UnsupportedOperationException

看看java.util.LinkedList的迭代器如何处理修改:在添加和删除方法期间,它首先调用checkForComodification()

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

最后它会将expectedModCount增加一个:

public void add(E e) {
    checkForComodification();
    [...]
    expectedModCount++;
}