JDK并發(fā)數(shù)據(jù)結(jié)構(gòu)

一、并發(fā)list
Vector和CopyOnWriteArrayList是兩個線程安全的list,如果在多線程環(huán)境中使用ArrayList則使用Collections.synchronizedList(List list)進(jìn)行包裝。但兩者實現(xiàn)的機(jī)制不同:
Vector的get和add/remove等操作都是采用synhronized同步方法,都需要獲得對象鎖,并發(fā)時會影響性能
代碼塊:

/*get 采用同步方法*/
public synchronized E get(int index) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        return elementData(index);
    }
/*set采用同步方法*/
 public synchronized E set(int index, E element) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        E oldValue = elementData(index);
        elementData[index] = element;
        return oldValue;
    }

CopyOnWriteArrayList利用了對象的不變性,讀操作時沒有加鎖,在試圖改變對象時,總是先獲得對象的副本,然后對副本進(jìn)行修改,最后將副本寫回,寫操作時用的重入鎖
代碼塊:

/*get方法*/
private E get(Object[] a, int index) {
        return (E) a[index];
    }
/*set方法采用ReentrantLock鎖*/
 public E set(int index, E element) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            E oldValue = get(elements, index);

            if (oldValue != element) {
                int len = elements.length;
                Object[] newElements = Arrays.copyOf(elements, len);
                newElements[index] = element;
                setArray(newElements);
            } else {
                // Not quite a no-op; ensures volatile write semantics
                setArray(elements);
            }
            return oldValue;
        } finally {
            lock.unlock();
        }
    }

對比:1.讀操作時,CopyOnWriteArrayList更快 2.寫操作時,Vector會比起快,CopyOnWriteArrayList首先申請了鎖,同時還要進(jìn)行對象副本復(fù)制

二、并發(fā)set
與list類似,set也有一個CopyOnWriteArraySet,實現(xiàn)set接口,也是線程安全的。適合讀多寫少的高并發(fā)場景,高并發(fā)寫場景使用Collections 的方法:
public static <T> Set<T> synchronizedSet(Set<T> s) 得到一個線程安全的set

三、并發(fā)map
多線程環(huán)境一般使用Collections.synchronizedMap()得到一個線程安全的map,但在高并發(fā)情況,使用java.concurrent包中的ConcurrentMap的子類ConcurrentHashMap,其get方法是無鎖的,put等操作采用分段鎖機(jī)制,從而提高其操作性能,而hashMap則是非線程安全的

四、并發(fā)queue
兩種:BlockingQueue(以此為接口的阻塞隊列)和ConcurrentLinkedQueue(高性能隊列),但都繼承自queue。
高并發(fā)場景下使用ConcurrentLinkedQueue隊列,而BlockingQueue用于簡化線程間的數(shù)據(jù)共享

五、并發(fā)deque
并發(fā)雙堆隊列

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

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

  • 1、概念簡介: 線程安全:就是當(dāng)多線程訪問時,采用了加鎖的機(jī)制;即當(dāng)一個線程訪問該類的某個數(shù)據(jù)時,會對這個數(shù)據(jù)進(jìn)行...
    青見青閱讀 8,167評論 0 4
  • 在一個方法內(nèi)部定義的變量都存儲在棧中,當(dāng)這個函數(shù)運(yùn)行結(jié)束后,其對應(yīng)的棧就會被回收,此時,在其方法體中定義的變量將不...
    Y了個J閱讀 4,547評論 1 14
  • 一.線程安全性 線程安全是建立在對于對象狀態(tài)訪問操作進(jìn)行管理,特別是對共享的與可變的狀態(tài)的訪問 解釋下上面的話: ...
    黃大大吃不胖閱讀 952評論 0 3
  • 算法與數(shù)據(jù)結(jié)構(gòu)(1),List 算法與數(shù)據(jù)結(jié)構(gòu)(2),Map 算法與數(shù)據(jù)結(jié)構(gòu)(3),并發(fā)結(jié)構(gòu) 本來已經(jīng)合上電腦了,...
    小鄧子閱讀 1,974評論 4 16
  • 低頭族,到那都是拿著個手機(jī)在那點(diǎn)點(diǎn)點(diǎn),朋友之間少了交流,親人之間少了交流,夫妻之間更少了交流,這樣的習(xí)慣磨滅了激情...
    馨之芬芳閱讀 151評論 0 0

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