java各種集合的執行緒安全
- 執行緒安全
首先要明白執行緒的工作原理,jvm有一個main memory,而每個執行緒有自己的working
memory,一個執行緒對一個variable進行操作時,都要在自己的working
memory裡面建立一個copy,操作完之後再寫入main
memory。多個執行緒同時操作同一個variable,就可能會出現不可預知的結果。根據上面的解釋,很容易想出相應的scenario。
而用synchronized的關鍵是建立一個monitor,這個monitor可以是要修改的variable也可以其他你認為合適的object比如method,然後通過給這個monitor加鎖來實現執行緒安全,每個執行緒在獲得這個鎖之後,要執行完
load到workingmemory -> use&assign -> store到mainmemory
的過程,才會釋放它得到的鎖。這樣就實現了所謂的執行緒安全。什麼是執行緒安全?執行緒安全是怎麼完成的(原理)? 執行緒安全就是說多執行緒訪問同一程式碼,不會產生不確定的結果。編寫執行緒安全的程式碼是低依靠執行緒同步。
-
Vector、ArrayList、LinkedList
Vector和ArrayList在使用上非常相似,都可用來表示一組數量可變的物件應用的集合,並且可以隨機地訪問其中的元素。 Vector的方法都是同步的(Synchronized),是執行緒安全的(thread-safe),而ArrayList的方法不是,由於執行緒的同步必然要影響效能,因此,ArrayList的效能比Vector好。 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
相關文章
- 【Java多執行緒】執行緒安全的集合Java執行緒
- Java併發-執行緒安全的集合類Java執行緒
- Java執行緒安全的集合類:Map、List、SetJava執行緒
- .Net 執行緒安全集合執行緒
- Java執行緒安全Java執行緒
- Java執行緒(一):執行緒安全與不安全Java執行緒
- iOS多執行緒安全-13種執行緒鎖?iOS執行緒
- .NET中各種執行緒同步鎖執行緒
- 集合框架與執行緒安全解決框架執行緒
- Java之執行緒安全問題的3種處理方式(通過執行緒同步)Java執行緒
- JUC之集合中的執行緒安全問題執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- 最全java多執行緒總結3——瞭解阻塞佇列和執行緒安全集合不Java執行緒佇列
- 【java】【多執行緒】建立執行緒的兩種常用方式(2)Java執行緒
- Java中確保執行緒安全最常用的兩種方式Java執行緒
- Java中實現執行緒安全HashSet的幾種方法 | baeldungJava執行緒
- Java提供的幾種執行緒池Java執行緒
- 【Java】執行緒的 6 種狀態Java執行緒
- Java 執行緒的5種狀態Java執行緒
- 詳解Java執行緒安全Java執行緒
- Java執行緒安全小結Java執行緒
- Java 執行緒安全 與 鎖Java執行緒
- 【Java】ConcurrentHashMap執行緒安全技巧JavaHashMap執行緒
- 執行緒-集合-反射執行緒反射
- 執行緒安全使用 HashMap 的四種技巧執行緒HashMap
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java併發實戰一:執行緒與執行緒安全Java執行緒
- 終止java執行緒的2種方法Java執行緒
- Java建立多執行緒的四種方式Java執行緒
- Java建立多執行緒的一種方法Java執行緒
- Java 四種執行緒池的用法分析Java執行緒
- java自帶的四種執行緒池Java執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- Java基礎之執行緒安全Java執行緒
- java synchronized 保護執行緒安全Javasynchronized執行緒
- 深入JAVA執行緒安全問題Java執行緒
- java進階(38)--執行緒安全Java執行緒