1、Fail-Fast Iterator
1、Fail-Fast迭代器在开始工作后,当发出集合底层的数据结构发生修改时就会快速失败,底层数据结构更改意味着从集合中添加、删除任何元素,但仅仅更新数据结构中的一些元素是不算作结构修改。
2、它是通过一个变量modCount用来记录修改次数来实现,迭代器工作过程中发现结构发生变化就会抛出ConcurrentModificationException异常,java.util包中的大多数集合在设计上是支持快速失败的。
以下是测试代码:
public class Demo01 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
//使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()){
String next = it.next();
System.out.println("next="+next);
list.remove("A");
}
}
}
运行截图:
迭代器在创建的时候就会保存结构修改的次数,如果迭代过程中发生结构变化导致modCount变化,会抛出一个ConcurrentModificationException
2、Fail-Safe Iterator
1、Fail-Safe迭代器是”弱一致的“,如果在迭代过程中对集合进行结构修改,他不会抛出任何异常
2、在多线程应用程序操作集合时,应该优先考虑支持Fail-safe的集合,以避免并发相关的问题,比如使用CopyOnWriteArrayList,CopyOnWriteArraySet,ConcurrentHashMap
public class Demo02 {
public static void main(String[] args) {
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("E");
//使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()){
String next = it.next();
System.out.println("next="+next);
list.remove("A");
}
System.out.println("list="+list);
}
}