成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

fail-fast與fail-safe在Java集合中的應(yīng)用

Drummor / 3574人閱讀

摘要:與在迭代器中的設(shè)計在中,最典型的與就是關(guān)于迭代器的設(shè)計。缺點是,迭代器不能正確及時的反應(yīng)集合中的內(nèi)容,而且一定程度上也增加了內(nèi)存的消耗。

fail-fast與fail-safe簡介

如果一個系統(tǒng),當(dāng)有異常或者錯誤發(fā)生時就立即中斷執(zhí)行,這種設(shè)計稱之為fail-fast。相反如果我們的系統(tǒng)可以在某種異?;蛘咤e誤發(fā)生時繼續(xù)執(zhí)行,不會被中斷,這種設(shè)計稱之為fail-safe。

fail-fast與fail-safe在Java迭代器中的設(shè)計

在Java中,最典型的fail-fast與fail-safe就是關(guān)于迭代器的設(shè)計。通常情況下,那些線程不安全的集合類產(chǎn)生的迭代器都是fail-fast的,而線程安全的集合類產(chǎn)生的迭代器是fail-safe的。fail-fast的迭代器會在迭代過程中,如果你修改了集合類里的內(nèi)容,則會拋出ConcurrentModificationException異常。fail-safe的迭代器則可以在迭代過程中任意修改集合類的內(nèi)容,不會有異常拋出。

Java的fail-fast迭代器

前面說過,線程安全的集合類產(chǎn)生的迭代器是基于fail-fast設(shè)計的,例如ArrayList。這種迭代器迭代過程中是直接訪問原數(shù)據(jù)信息的,所以當(dāng)原集合內(nèi)容修改了后,迭代器不能保證正確的迭代過程。代碼示例如下:

    public static void failFast() {

        List list = new ArrayList<>();

        list.add("item-1");
        list.add("item-2");
        list.add("item-3");
        list.add("item-4");

        Iterator it = list.iterator();

        while (it.hasNext()) {
            String item = it.next();
            System.out.println(item);
            list.add("itme-5"); // 下次迭代時會拋出ConcurrentModificationException異常
        }

    }

通過分析ArrayList源碼可以看出,當(dāng)對ArrayList做添加或者刪除元素的操作時,都會修改modCount這個變量,而ArrayList的迭代器每次迭代的時候,又都回去檢查當(dāng)前modCount和迭代器產(chǎn)生時的expectedModCount變量是否相等,如果不等就會拋出ConcurrentModificationException異常。

protected transient int modCount = 0;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    // 上面那個方法調(diào)用后會修改modCount
    ....
}


// ArrayList的迭代器

private class Itr implements Iterator {

    public E next() {
        checkForComodification();
        ...
    }

    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
    
    ...
}
Java的fail-safe迭代器

對于那些線程安全的集合類,在調(diào)用iterator方法產(chǎn)生迭代器的時候,會將當(dāng)前集合的素有元素都做一個快照,即復(fù)制一份副本。每次迭代的時候都是訪問這個快照內(nèi)的元素,而不是原集合的元素。代碼示例如下:

    public static void failSafe() {

        List list = new CopyOnWriteArrayList<>();

        list.add("item-1");
        list.add("item-2");
        list.add("item-3");
        list.add("item-4");

        Iterator it = list.iterator();

        while (it.hasNext()) {
            String item = it.next();
            System.out.println(item);
            list.add("itme-5");
        }

        System.out.println(list.size()); // 會打印出來8,迭代四次,四個新元素插入到了集合中。
    }

這種設(shè)計的好處是保證了在多線程操縱同一個集合的時候,不會因為某個線程修改了集合,而影響其他正在迭代訪問集合的線程。缺點是,迭代器不能正確及時的反應(yīng)集合中的內(nèi)容,而且一定程度上也增加了內(nèi)存的消耗。

迭代器小提示

如果用Java的for loop來訪問集合,原理上還是用迭代器的方式,所以下面的代碼同樣會拋出ConcurrentModificationException異常。

        List list = new ArrayList<>();

        list.add("item-1");
        list.add("item-2");
        list.add("item-3");
        list.add("item-4");
        
        for (String item : list) {
            System.err.println(item);
            list.add("itme-5");
        }

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/69187.html

相關(guān)文章

  • 快速失敗(fail-fast)安全失敗(fail-safe)

    摘要:注意,迭代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現(xiàn)不同步并發(fā)修改做出任何硬性保證??焖偈〉鲿M最大努力拋出。 fail-fast與fail-safe 在Collection集合的各個類中,有線程安全和線程不安全這2大類的版本。 對于線程不安全的類,并發(fā)情況下可能會出現(xiàn)fail-fast情況;而線程安全的類,可能出現(xiàn)fail-safe的情況。 一、并發(fā)修改 當(dāng)一...

    imtianx 評論0 收藏0
  • fail-fastfail-safe

    摘要:一什么是機制在用迭代器遍歷集合時當(dāng)集合的結(jié)構(gòu)被修改會拋出異常二什么情況下集合的結(jié)構(gòu)會被修改單線程環(huán)境集合在遍歷的過程中如果要對集合進(jìn)行增刪操作沒有調(diào)用迭代器的方法而是用的集合自身的方法則可能會產(chǎn)生事件多線程環(huán)境下當(dāng)一個線程在遍歷某個集合 一.什么是fail-fast機制? 在用迭代器遍歷集合時,當(dāng)集合的結(jié)構(gòu)被修改,會拋出ConcurrentModificationException異常...

    魏明 評論0 收藏0
  • 帶你了解集合世界的fail-fast機制 和 CopyOnWriteArrayList 源碼詳解

    摘要:體現(xiàn)的就是適配器模式。數(shù)組對象集合世界中的機制機制集合世界中比較常見的錯誤檢測機制,防止在對集合進(jìn)行遍歷過程當(dāng)中,出現(xiàn)意料之外的修改,會通過異常暴力的反應(yīng)出來。而在增強循環(huán)中,集合遍歷是通過進(jìn)行的。 前言 學(xué)習(xí)情況記錄 時間:week 2 SMART子目標(biāo) :Java 容器 記錄在學(xué)習(xí)Java容器 知識點中,關(guān)于List的重點知識點。 知識點概覽: 容器中的設(shè)計模式 從Array...

    young.li 評論0 收藏0
  • 面試官:說說快速失敗和安全失敗是什么

    摘要:我們都接觸這些集合類,這些在包的集合類就都是快速失敗的而包下的類都是安全失敗,比如。安全失敗明白了什么是快速失敗之后,安全失敗也是非常好理解的。最后說明一下,快速失敗和安全失敗是對迭代器而言的。 什么是快速失?。╢ail-fast)和安全失?。╢ail-safe)?它們又和什么內(nèi)容有關(guān)系。以上兩點就是這篇文章的內(nèi)容,廢話不多話,正文請慢用。 我們都接觸 HashMap、ArrayLis...

    calx 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<