fail-fast 与 fail-safe 是什么?

2020-04-10  本文已影响0人  Java元宇宙

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
上一篇下一篇

猜你喜欢

热点阅读