集合的線程安全性


Vector、ArrayList、LinkedList

Vector和ArrayList在使用上非常相似,都可用來表示一組數量可變的對象應用的集合,並且可以隨機地訪問其中的元素。 
Vector的方法都是同步的(Synchronized),是線程安全的(thread-safe),而ArrayList的方法不是,由於線程的同步必然要影響性能,因此,ArrayList的性能比Vector好。 LinkedList也不是線程安全的。

ArrayList和LinkedList區別
對於處理一列數據項,Java提供了兩個類ArrayList和LinkedList,ArrayList的內部實現是基於內部數組Object[],所以從概念上講,它更象數組,但LinkedList的內部實現是基於一組連接的記錄,所以,它更象一個鏈表結構,所以,它們在性能上有很大的差別。  
從上面的分析可知,在ArrayList的前面或中間插入數據時,你必須將其后的所有數據相應的后移,這樣必然要花費較多時間,所以,當你的操作是在一列數據的后面添加數據而不是在前面或中間,並且需要隨機地訪問其中的元素時,使用ArrayList會提供比較好的性能  
而訪問鏈表中的某個元素時,就必須從鏈表的一端開始沿着連接方向一個一個元素地去查找,直到找到所需的元素為止,所以,當你的操作是在一列數據的前面或中間添加或刪除數據,並且按照順序訪問其中的元素時,就應該使用LinkedList了。  
如果在編程中,1,2兩種情形交替出現,這時,你可以考慮使用List這樣的通用接口,而不用關心具體的實現,在具體的情形下,它的性能由具體的實現來保證。

HashTable,HashMap,HashSet

HashTable和HashMap采用相同的存儲機制,二者的實現基本一致,不同的是:
1)、HashMap是非線程安全的,HashTable是線程安全的,內部的方法基本都是synchronized。
2)、HashTable不允許有null值的存在。
在HashTable中調用put方法時,如果key為null,直接拋出NullPointerException。其它細微的差別還有,比如初始化Entry數組的大小等等,但基本思想和HashMap一樣。

HashSet:
1、HashSet基於HashMap實現,無容量限制。
2、HashSet是非線程安全的。
3、HashSet不保證有序。

HashMap:
1、HashMap采用數組方式存儲key,value構成的Entry對象,無容量限制。
2、HashMap基於Key hash查找Entry對象存放到數組的位置,對於hash沖突采用鏈表的方式來解決。
3、HashMap在插入元素時可能會要擴大數組的容量,在擴大容量時須要重新計算hash,並復制對象到新的數組中。
4、HashMap是非線程安全的。
5、HashMap遍歷使用的是Iterator

HashTable
1、HashTable是線程安全的。
2、HashTable中無論是Key,還是Value都不允許為null。
3、HashTable遍歷使用的是Enumeration。

TreeSet,TreeMap

TreeSet:
 1、TreeSet基於TreeMap實現,支持排序。
 2、TreeSet是非線程安全的。

從對HashSet和TreeSet的描述來看,TreeSet和HashSet一樣,也是完全基於Map來實現的,並且都不支持get(int)來獲取指定位置的元素(需要遍歷獲取),另外TreeSet還提供了一些排序方面的支持。例如傳入Comparator實現、descendingSet以及descendingIterator等。

TreeMap:
1、TreeMap是一個典型的基於紅黑樹的Map實現,因此它要求一定要有Key比較的方法,要么傳入Comparator實現,要么key對象實現Comparable接口。
2、TreeMap是非線程安全的。

總結

Vector,HashTable是線程安全的。

ArrayList,LinkedList,HashMap,TreeMap,HashSet,TreeSet都不是線程安全的。

java.util.concurrent包提供了映射表、有序集和隊列的高效實現,允許並發訪問:ConcurrentHashMap,ConcurrentSkipListMap,ConcurrentSkipListSet,ConcurrentLinkedQueue

當然對於上述線程不安全的集合也可以使用同步包裝器Collections.synchronizedList(List<T> list)等,使得集合的方法使用鎖加以保護,提供了線程安全的訪問。如果在另一個線程可能進行修改時要對集合進行迭代,仍然需要使用“客戶端”鎖定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM