線程安全的List都有什么?

1、Vector
這個是最常聽到的線程安全的List實現(xiàn),但是已經(jīng)不常用了。
內(nèi)部實現(xiàn)直接使用synchronized 關(guān)鍵字對 一些操作的方法加鎖。性能很慢。
2、SynchronizedList
使用Collections.synchronizedList(list); 將list包裝成SynchronizedList
需要注意的是SynchronizedList的add等操作加了鎖,但是iterator()方法沒有加鎖,如果使用迭代器遍歷的時候需要在外面手動加鎖。
適用場景:當(dāng)不需要使用iterator()并且對性能要求不高的場景。

SynchronizedList 和 Vector區(qū)別
1> SynchronizedList 有較好的擴展性,可以將ArrayList ,LinkedList等都改成同步的,而Vector底層只有數(shù)組的結(jié)構(gòu)。
2> SynchronizedList 并沒有對Iterator方法進行加鎖,遍歷時需要手動同步處理,Vector加鎖了。
3> SynchronizedList 可以指定鎖定的對象。
4> 擴容機制不一樣SynchronizedList 1.5倍 ,Vector 2倍。
5、SynchronizedList使用同步代碼塊,鎖的范圍更小。Vector鎖的方法。

3、CopyOnWriteArrayList
在寫的時候加鎖(ReentrantLock鎖),讀的時候不加鎖,大大提升了讀的速度。
添加元素的時候,先加鎖,再復(fù)制替換操作,再釋放鎖。

    public boolean add(E e) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            Object[] newElements = Arrays.copyOf(elements, len + 1);
            newElements[len] = e;
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }

適用場景:適用于讀多寫少的場景。

CopyOnWriteArraySet 這個集合也是在add時加鎖,不過在增加元素前會先判斷元素是否存在,不存在才會調(diào)add方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容