共计 1376 个字符,预计需要花费 4 分钟才能阅读完成。
疾速失败 也就是 fail-fast,它是 java 汇合的一种谬误检测检测机制。当多个线程对汇合进行构造上的扭转操作时,就有可能产生 fail-fast 工夫。例如,假如两个线程 A,B。线程 A 通过迭代器(Iterator)在遍历汇合 X 中的元素时,线程 B 批改了汇合 X 的构造,删除或新增元素,那么这个时候程序就会抛出 java.util.ConcurrentModificationException
异样,从而产生 fail-fast 事件。
例如:
public static void main(String[] args) {HashMap<String ,Integer> hashMap = new HashMap<>();
hashMap.put("a", 1);
hashMap.put("b", 2);
hashMap.put("c", 3);
Set set = hashMap.entrySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
hashMap.put("进行增加操作", 4);
System.out.println("此时 hashMap 长度为" + hashMap.size());
}
}
output:
a=1
此时 hashMap 长度为 4
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1526)
at java.base/java.util.HashMap$EntryIterator.next(HashMap.java:1524)
at FastFail.main(FastFail.java:16)
Iterator 反对从源汇合中平安地删除对象,删除的办法在 Iterator 上调用 remove()办法。这样做的益处是能够防止 ConcurrentModificationException 异样产生。
public static void main(String[] args) {HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("a", 1);
hashMap.put("b", 2);
hashMap.put("c", 3);
Iterator iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()) {Map.Entry<String, Integer> entry = (Entry<String, Integer>) iterator.next();
System.out.println(entry);
if("b".equals(entry.getKey())){iterator.remove();
System.out.println("删除胜利");
}
}
}
output:
a=1
b=2
删除胜利
c=3
正文完