【面试:基础篇06.1:FailFast与FailSafe机制】
介绍:
迭代器进行迭代操作时是否可以修改被迭代对象 分为了 两种机制 一种是:FailFast机制,另一个是:FailSafe。
01.FailFast
FailFast机制是迭代器进行迭代操作时不可以修改被迭代对象,否则会抛出ConcurrentModificationException 译为 并发异常,主要的应用场景就是 多线程同时操作一个被迭代对象 为了保证数据的一致性 抛出异常。
02.FailFast
FailSafe机制是迭代器进行操作时可以修改被迭代对象,不会抛出异常 但迭代过程中 被迭代对象的值不变,迭代后改变被迭代对象。
代码
FailFast代码
ArrayList<Integer> L=new ArrayList<>();
for (int i=0;i<5;i++) {
L.add(i);
}
Iterator<Integer> it = L.iterator();
while (it.hasNext()){
int val = it.next();
L.add(5);// 在迭代器遍历过程中出现报错 ConcurrentModificationException 并发修改异常
System.out.println(val);
}
结果
0
Exception in thread "main" java.util.ConcurrentModificationException
可以看出ArrayList()是FailFast机制抛出异常
FailSafe代码
CopyOnWriteArrayList<Integer> L = new CopyOnWriteArrayList<>();
for (int i=0;i<5;i++) {
L.add(i);
}
Iterator<Integer> it = L.iterator();
while (it.hasNext()) {
int val = it.next();
L.add(9);
System.out.printf("%d ",val);
}
System.out.println();
System.out.println(L);
}
结果
0 1 2 3 4
[0, 1, 2, 3, 4, 9, 9, 9, 9, 9]
可以看出CopyOnWriteArrayList()是FailSafe机制,在迭代器过程中遍历结果不变,遍历结束后输出list 发现插入成功