fail-fast 快速失败,是指在遍历集合时,检查遍历过程中集合的modCount
是否改变,如果改变就会抛出java.util.ConcurrentModificationException
异常。
fail-safe 安全失败,是指在遍历集合时,先生成一份拷贝,然后遍历拷贝,也就不检查 modCount 了。
java.util
包下的普通容器,比如 ArrayList、HashMap 都采用 fail-fast;java.util.concurrent
包下的并发容器,比如 ConcurrentHashMap 就采用 fail-safe。
fail-fast 快速失败
fail-fast 是集合中的快速失败机制,对集合进行遍历操作的时候,会检查操作之前的集合修改次数expectedModCount
,与当前的集合修改次数 modCount
是否相同,如果不同就会报 java.util.ConcurrentModificationException
异常。
如下面的代码所示,我在进行 forEach 循环的中间执行一个 add() 操作,list 被修改就会执行 modCount++
,导致在遍历过程中 modCount != expectModCount
,抛出java.util.ConcurrentModificationException
异常。
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.forEach(s -> {
System.out.println(s);
list.add("ccc");
});
fail-fast
fail-safe 安全失败
fail-safe 是指安全失败机制,对集合进行遍历操作的时候,它不是遍历集合本身,而是先拷贝一份集合,然后遍历这个集合。
Map<String, String> map = new ConcurrentHashMap();
map.put("a", "a1");
map.put("b", "b1");
map.forEach((k, v) -> {
System.out.println(k + ": " + v);
map.put("c", "c1");
});
fail-safe
网友评论