快速失败 也就是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

java.util下的所有集合类都是fail-fast,而concurrent包中的集合类都是fail-safe。fast-safe则是班长用相机拍了照,来算人数。


林慫慫
11 声望0 粉丝

« 上一篇
泛型小结
下一篇 »
插入排序