天天看點

線程安全的集合

集合接口:

注意:本文的擴容是指當超出一定的容量,将原來的值都得Copy到新的空間

List:有序可重複

Set:無序不可重複

map:鍵值對

實作list接口的有ArrayList,LinkedList,Vector

ArrayList:底層是以數組的形式來存儲資料的,初始容量為10,當超過數組長度是;進行擴容,擴容容量為(原來的容量)*1.5+1,線程不安全;

LinkedList:底層是連結清單,動态,不安全

Vector:底層以數組的形式來存儲資料,初始容量10,當超出一個時,開始進行擴容,擴充容量為原來容量的2倍,是線程安全的,每一個方法的實作都進行了syn操作,是以會導緻效率比較低;

實作set接口的有HashSet,sortedSet...

hashset:線程不安全,初始容量為16,加載因子為0.75,擴充容量為(原來的容量)*2;

Map:實作Map接口的為HashMap、

HashMap:線程不安全,底層是一個散清單(數組和連結清單的結合):初始容量16,加載因子0.75,擴充容量為(原來的容量)*2

在實作時有必要重寫hashcode和equels方法:因為在進行put操作的時候會根據添加對象的hashcode來查找該對象應該屬于哪條連結清單,再進行相應的操作,在jdk1.8,對散清單進行了一些優化,當連結清單節點大于8時,為了避免連結清單成環,将轉換成為紅黑樹。

TableMap:線程安全,每個方法加了syn.同樣,這樣會導緻效率低下

在java.util.concurrent包下面提供了很多線程安全的集合:

concurrentHashMap:使用了分段鎖,在一定程度上避免了沒鎖帶來的不安全性,也避免了全局加鎖帶來的底性能;

CopyOnWriteArrayList:線程安全,利于多讀少寫的場景

ConcurrentLinkedQueue;

BlockingQueue

ConcurrentSkipListMap

還可以使用Collections.synchronizedMap(new HashMap());等方法,這裡它是使用了一個委托,将自己的Map相關的功能交給傳入的HashMap來實作。

繼續閱讀