中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中COW機制已經相關類是什么

發布時間:2020-10-27 11:18:54 來源:億速云 閱讀:200 作者:小新 欄目:編程語言

這篇文章主要介紹java中COW機制已經相關類是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

COW機制已經相關類

Vector和SynchronizedList

我們知道ArrayList是用于替代Vector的,Vector是線程安全的容器。因為它幾乎在每個方法聲明處都加了synchronized關鍵字來使容器安全。如果使用Collections.synchronizedList(new ArrayList())來使ArrayList變成是線程安全的話,也是幾乎都是每個方法都加上synchronized關鍵字的,只不過它不是加在方法的聲明處,而是方法的內部。

多線程下for循環迭代Vector或者SynchronizedList,進行delete和get操作會發生數組下標錯誤的異常。

在JDK5以后,Java推薦使用for-each(迭代器)來遍歷我們的集合,好處就是簡潔、數組索引的邊界值只計算一次。如果使用for-each(迭代器)來做上面的操作,會拋出ConcurrentModificationException異常。

如果想要完美解決上面所講的問題,我們可以在遍歷前加鎖:

遍歷一下容器都要我加上鎖,這這這不是要慢死了嗎。的確是挺慢的。因為加鎖粒度太大。

CopyOnWriteArrayList是同步List的替代品,CopyOnWriteArraySet是同步Set的替代品。

Hashtable、Vector加鎖的粒度大(直接在方法聲明處使用synchronized)ConcurrentHashMap、CopyOnWriteArrayList加鎖粒度小(用各種的方式來實現線程安全,比如我們知道的ConcurrentHashMap用了cas鎖、volatile等方式來實現線程安全..)JUC下的線程安全容器在遍歷的時候不會拋出ConcurrentModificationException異常所以一般來說,我們都會使用JUC包下給我們提供的線程安全容器,而不是使用老一代的線程安全容器。

CopyOnWriteArrayList實現原理

CopyOnWriteArrayList是線程安全容器(相對于ArrayList),底層通過復制數組的方式來實現。CopyOnWriteArrayList在遍歷的使用不會拋出ConcurrentModificationException異常,并且遍歷的時候就不用額外加鎖元素可以為null

/** 可重入鎖對象 */
    final transient ReentrantLock lock = new ReentrantLock();
    /** CopyOnWriteArrayList底層由數組實現,volatile修飾 */
    private transient volatile Object[] array;

    final Object[] getArray() {
        return array;
    }
    final void setArray(Object[] a) {
        array = a;
    }
    // 初始化CopyOnWriteArrayList相當于初始化數組
    public CopyOnWriteArrayList() {
        setArray(new Object[0]);
    }

CopyOnWriteArrayList底層就是數組,加鎖就交由ReentrantLock來完成。

通過代碼我們可以知道:在add(),set(),remove() 的時候就上鎖,并復制一個新數組,增加操作在新數組上完成,將array指向到新數組中,最后解鎖。在修改時,復制出一個新數組,修改的操作在新數組中完成,最后將新數組交由array變量指向。寫加鎖,讀不加鎖

CopyOnWriteArrayList缺點

內存占用:如果CopyOnWriteArrayList經常要增刪改里面的數據,經常要執行add()、set()、remove()的話,那是比較耗費內存的。

因為我們知道每次add()、set()、remove()這些增刪改操作都要復制一個數組出來。

數據一致性:CopyOnWrite容器只能保證數據的最終一致性,不能保證數據的實時一致性。

從上面的例子也可以看出來,比如線程A在迭代CopyOnWriteArrayList容器的數據。線程B在線程A迭代的間隙中將CopyOnWriteArrayList部分的數據修改了(已經調用setArray()了)。但是線程A迭代出來的是原有的數據。

以上是java中COW機制已經相關類是什么的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

纳雍县| 安徽省| 原平市| 凤翔县| 隆德县| 嘉义市| 军事| 四川省| 丹巴县| 高要市| 荆门市| 桦南县| 黄龙县| 合肥市| 随州市| 阿勒泰市| 乳山市| 新竹县| 二连浩特市| 栖霞市| 延川县| 宝坻区| 伊春市| 石狮市| 宣恩县| 长葛市| 廉江市| 六盘水市| 镇安县| 西昌市| 漯河市| 马鞍山市| 泰州市| 丹阳市| 沙河市| 乃东县| 眉山市| 宿迁市| 玛纳斯县| 蕉岭县| 东宁县|