java中的集合有线程安全的j.u.c包下的集合与java.util下面的线程不安全的集合。针对这两种集合有fail-fast与fail-safe两种模式。
fail-fast表示快速失败,失败即立即返回失败。
fail-safe表示安全跳过,不会抛异常中断。
线程不安全的集合在获取迭代器迭代的时候,如果集合中的元素发生了变化,例如新增或者删除,由于线程不安全,迭代器在next时会直接抛出concurrentModificationException,通过内部的一个modCount判断是否等于expectedModCount来进行比较。从而马上就抛异常退出。而线程安全的集合在迭代时首先会复制一份集合中的内容,然后迭代的过程中由于都是通过副本来迭代的,所以对迭代没有影响,但是数据可能并不会立马反映在迭代过程中。
1.fail-fast案例
public class TestFailFast {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
list.add(4);
}
}
}
结果