1. 程式人生 > >JUC-併發集合類

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