据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的失败快速行为.困惑: - ((
如果在创建迭代器之后的任何时候对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)
该计划执行以下操作:
next()两次电话.next()再次调用(在向量被修改之后)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)
| 归档时间: |
|
| 查看次数: |
6410 次 |
| 最近记录: |