fail-fast:ArrayList 是典型代表,遍历的同时不能修改,尽快失败
fail-safe: CopyOnWriteArrayList 是 典型代表,遍历的同时可以修改,原理是读写分离,但会牺牲一致性(读的是旧数据,但其实数据已经更新了)
ArrayList
public class Main {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
for (Object o : list) {
if(o.equals("3")) list.add("4");
}
}
}
结果:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)
at Main.main(Main.java:16)
出现了并发修改异常,原理是底层的一个modCount属性,记录当前这个ArrayList被修改过的次数,通过迭代器遍历的过程中,次数不一致就会报错。
CopyOnWriteArrayList:原理是写入的数组和读的数组不是一个数组,读的是旧数组,写的是新数组。