JUC-併發集合類
在大家學習Java基礎時都知道,ArrayList、LinkedList、HashMap、HashSet等常用的容器類都是執行緒不安全的,如果有多個執行緒訪問它們時將會出現意外結果,下邊我們講解如果使用執行緒安全的集合類。
- 使用java.util包下執行緒安全的集合類
- 使用Collections工具類將非執行緒安全的集合包裝成執行緒安全的集合
- 使用juc中的併發集合類
Vector與Hashtable
Vector
Vector是一個古老的基於順序表的實現,從Java1.0開始就有,底層是用陣列儲存資料,從原始碼我們可以看它的執行緒安全是在內部方法上加synchronized關鍵字來實現的,因此,這種執行緒安全往往效率低下!
Hashtable
Hashtable與Vector一樣,從原始碼中看它也是在內部方法上加synchronized關鍵字來實現的,同樣,它也是效率低下的!
Collections處理非執行緒安全的集合
Collections可以將任意的集合類包裝成執行緒安全的,它內部提供了synchronizedXxx()方法,我們可以呼叫 Collections.synchronizedXxx()方法傳入一個普通的集合類,它給我們返回一個包裝後的執行緒安全的實現類,其實內部還是使用我們原始集合類儲存資料,只不過是在呼叫原始集合類方法時加了synchronized,因為這種方法同樣是效率低下的!
JUC中的集合類
java.util.concurrent包下為我們提供了大量的與Set、List、Map、Queue資料結構對應的高效能的執行緒安全集合類,如下
- CopyOnWriteArrayList
- CopyOnWriteArraySet
- ConcurrentHashMap
- ConcurrentLinkedQueue
- ConcurrentLinkedDeque
- ConcurrentMap
- ConcurrentNavigableMap
- ConcurrentSkipListMap
- ConcurrentSkipListSet
CopyOnWriteArrayList
在一些場景中了存大大量讀取操作,只有少數寫操作(修改),這時對於讀操作完全沒必要加鎖,使用多個執行緒進行讀取操作,提高執行緒效能,JDK中提供了CopyOnWriteArrayList集合類,它是List集合的實現,對讀取操作不用加鎖,寫入也不會阻塞讀取,只有寫與寫之間是同步等待的。因此大大提供了程式效能
當進行寫操作(add()、set() 和 remove() 等等),需要複製整個基礎陣列,開銷很大!
當進行讀取操作(使用迭代器進行遍歷)時速度很快,並且不會與其他執行緒發生衝突!
CopyOnWriteArraySet
ConcurrentHashMap
ConcurrentNavigableMap
ConcurrentLinkedQueue
ConcurrentSkipListMap
ConcurrentSkipListMap內部是基於跳錶來實現的
跳錶內部所有連結串列的元素都是可排序的
ConcurrentSkipListSet