fail-fast 快速失敗,是指在遍歷集合時,檢查遍歷過程中集合的modCount是否改變,如果改變就會拋出java.util.ConcurrentModificationException異常。
fail-safe 安全失敗,是指在遍歷集合時,先生成一份拷貝,然后遍歷拷貝,也就不檢查 modCount 了。
java.util包下的普通容器,比如 ArrayList、HashMap 都采用 fail-fast;java.util.concurrent包下的并發(fā)容器,比如 ConcurrentHashMap 就采用 fail-safe。
fail-fast 快速失敗
fail-fast 是集合中的快速失敗機制,對集合進行遍歷操作的時候,會檢查操作之前的集合修改次數(shù)expectedModCount,與當前的集合修改次數(shù) modCount 是否相同,如果不同就會報 java.util.ConcurrentModificationException 異常。
如下面的代碼所示,我在進行 forEach 循環(huán)的中間執(zhí)行一個 add() 操作,list 被修改就會執(zhí)行 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