为什么Vector方法Iterator和ListIterator快速失败

Dee*_*pak 3 java collections

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Vector.html

Vector的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建Iterator之后的任何时候对Vector进行结构修改,除了通过Iterator自己的remove或add方法之外,Iterator将抛出ConcurrentModificationException.因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险.Vector的元素方法返回的枚举不是快速失败的.请注意,迭代器的故障快速行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证.失败快速迭代器会尽最大努力抛出ConcurrentModificationException.因此,编写依赖于此异常的程序以确保其正确性是错误的:迭代器的快速失败行为应仅用于检测错误

你能给我一个例子来验证上面的语句吗?我还不清楚向量的方法Iterator和ListIterator的失败快速行为.困惑: - ((

aio*_*obe 8

如果在创建迭代器之后的任何时候对Vector进行结构修改,除了通过Iterator自己的remove或add方法之外,迭代器将抛出一个ConcurrentModificationException.

这是一个例子:

import java.util.*;

public class Test {

    public static void main(String[] args) {
        List<String> strings = new Vector<String>();

        strings.add("lorem");
        strings.add("ipsum");
        strings.add("dolor");
        strings.add("sit");

        int i = 0;

        Iterator<String> iter = strings.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());

            // Modify the list in the middle of iteration.
            if (i++ == 1)
                strings.remove(0);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

lorem
ipsum
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    at java.util.AbstractList$Itr.next(AbstractList.java:343)
    at Test.main(Test.java:18)
Run Code Online (Sandbox Code Playgroud)

该计划执行以下操作:

  1. 创建一个Vector并获取一个迭代器
  2. next()两次电话.
  3. 修改向量(通过删除第一个元素)
  4. next()再次调用(在向量被修改之后)
  5. 这会导致ConcurrentModificationException抛出.

由于Java的for-each循环依赖于迭代器,因此这些构造也可能抛出ConcurrentModificationExceptions.解决的办法是迭代之前,在列表的副本(所以你遍历复印件)或者使用例如一个CopyOnWriteArrayList这样的:

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

public class Test {

    public static void main(String[] args) {
        List<String> strings = new CopyOnWriteArrayList<String>();

        strings.add("lorem");
        strings.add("ipsum");
        strings.add("dolor");
        strings.add("sit");

        int i = 0;

        Iterator<String> iter = strings.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());

            // Modify the list in the middle of iteration.
            if (i++ == 1)
                strings.remove(0);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

lorem
ipsum
dolor
sit
Run Code Online (Sandbox Code Playgroud)