1. 程式人生 > >Java concurrent包中常用的類

Java concurrent包中常用的類

1、 Atomic類

     基於 compareAndSwap,即CAS操作實現。 CAS指令有兩個步驟:衝突檢測和更新操作。

     CAS指令需要3個運算元:記憶體位置(V),舊的預期值(A),新值(B)。CAS指令執行時,首先比較記憶體位置V處的值和A的值是否相等(衝突檢測),如果相等,就用新值B覆蓋A(更新操作),否則,就什麼也不做。

2、ConcurrentHashMap

     (1)、使用鎖分段技術。ConcurrentHashMap不是將每個方法上在同一個鎖上同步使得一次只能有一個執行緒訪問容器,而是使用一種粒度更細的鎖機制來實現更大程度上的共享,這種機制稱為“分段鎖”。

在這種機制中,任意數量的讀取執行緒可以併發的訪問Map,執行讀取操作的執行緒和執行寫入操作的執行緒可以併發的訪問Map,並且一定數量的執行緒可以併發的修改Map。

      ConcurrentHashMap是由Segment陣列結構和HashEntry陣列結構組成。Segment是一種可重入鎖ReentrantLock,在ConcurrentHashMap裡扮演鎖的角色,HashEntry則用於儲存鍵值對資料。一個ConcurrentHashMap裡包含一個Segment陣列,Segment的結構和HashMap類似,是一種陣列和連結串列結構, 一個Segment裡包含一個HashEntry陣列,每個HashEntry是一個連結串列結構的元素, 每個Segment守護者一個HashEntry數組裡的元素,當對HashEntry陣列的資料進行修改時,必須首先獲得它對應的Segment鎖。

具體參見這裡ConcurrentHashMap原始碼之put和get方法

3、 CopyOnWriteArrayList

        使用了一種叫寫時複製的方法,當有新元素新增到CopyOnWriteArrayList時,先從原有的陣列中拷貝一份出來(是將整個陣列元素都複製出來),然後在新的陣列做寫操作,寫完之後,再將原來的陣列引用指向到新陣列。

讀操作不用加鎖,寫操作需要加鎖,不然多執行緒會複製出多個版本出來。

4、 CopyOnWriteArraySet

CopyOnWriteArraySet是通過CopyOnWriteArrayList實現的,並不是基於散列表。

5、 ArrayBlockingQueue

一個由陣列結構組成的有界阻塞佇列。