Java的集合fail-fast,fail-safe机制

101 阅读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"); } } }

运行截图

image.png 迭代器在创建的时候就会保存结构修改的次数,如果迭代过程中发生结构变化导致modCount变化,会抛出一个ConcurrentModificationException

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); } }

运行截图 image.png

这就是Java的集合fail-fast,fail-safe机制