[Java多線程 九]---JUC包下併發集合類

轉載請註明出處:http://www.cnblogs.com/skywang12345/p/3498454.html

之前,在”Java 集合系列目錄(Category)”中,講解了Java集合包中的各個類。接下來,將展開對JUC包中的集合進行學習。在學習之前,先溫習一下”Java集合包”

Java集合包

介紹java集合的架構。主體內容包括Collection集合和Map類;而Collection集合又可以劃分爲List(隊列)和Set(集合)。本節只是進行一下概述,詳細內容見之前在數據結構部分寫的博文來回顧集合框架。

http://blog.csdn.net/sinat_33087001/article/details/73775688

這裏寫圖片描述

主體內容包括Collection集合Map類;而Collection集合又可以劃分爲List(隊列)和Set(集合)。

List的實現類

List的實現類主要有: LinkedList, ArrayList, Vector, Stack。

  • LinkedList底層是雙向鏈表;它不是線程安全的,只適用於單線程。

  • ArrayList底層是一個動態數組;它也不是線程安全的,只適用於單線程。

  • Vector底層是矢量數組;不過和ArrayList不同的是,Vector是線程安全的,它支持併發。

  • Stack是Vector實現的棧;和Vector一樣,它也是線程安全的

Set的實現類

Set的實現類主要有: HastSet和TreeSet。

  • HashSet 是一個沒有重複元素的集合,它通過HashMap實現的;HashSet不是線程安全的,只適用於單線程。
  • TreeSet也是一個沒有重複元素的集合,不過和HashSet不同的是,TreeSet中的元素是有序的;它是通過TreeMap實現的;TreeSet也不是線程安全的,只適用於單線程。

Map的實現類

Map的實現類主要有: HashMap,WeakHashMap, Hashtable和TreeMap。

  • HashMap是存儲“鍵-值對”的哈希表;它不是線程安全的,只適用於單線程。

  • WeakHashMap是也是哈希表;和HashMap不同的是,HashMap的“鍵”是強引用類型,而WeakHashMap的“鍵”是弱引用類型,也就是說當WeakHashMap 中的某個鍵不再正常使用時,會被從WeakHashMap中被自動移除,WeakHashMap也不是線程安全的,只適用於單線程。

  • Hashtable也是哈希表;和HashMap不同的是,Hashtable是線程安全的,支持併發。

  • TreeMap也是哈希表,不過TreeMap中的“鍵-值對”是有序的,它是通過R-B Tree(紅黑樹)實現的;TreeMap不是線程安全的,只適用於單線程。

如何線程安全

綜合以上考慮,線程安全的實現類有vector,stack,hashtable 爲了方便,我們將前面介紹集合類統稱爲”java集合包“。java集合包大多是“非線程安全的”,雖然可以通過Collections工具類中的方法獲取java集合包對應的同步類,但是這些同步類的併發效率並不是很高。爲了更好的支持高併發任務,併發大師Doug Lea在JUC(java.util.concurrent)包中添加了java集合包中單線程類的對應的支持高併發的類。

例如,ArrayList對應的高併發類是CopyOnWriteArrayListHashMap對應的高併發類是ConcurrentHashMap,等等。

JUC中的集合類

下面,我們先了解JUC包中集合類的框架;爲了方便講訴,我將JUC包中的集合類劃分爲3部分來進行說明。在簡單的瞭解JUC包中集合類的框架之後,後面的章節再逐步對各個類進行介紹。

JUC包中List和Set實現類

JUC集合包中的List和Set實現類包括: CopyOnWriteArrayList, CopyOnWriteArraySet和ConcurrentSkipListSet。ConcurrentSkipListSet稍後在說明Map時再說明,CopyOnWriteArrayList 和 CopyOnWriteArraySet的框架如下圖所示:

這裏寫圖片描述

1, CopyOnWriteArrayList相當於線程安全的ArrayList,它實現了List接口。CopyOnWriteArrayList是支持高併發的。

2,CopyOnWriteArraySet相當於線程安全的HashSet,它繼承於AbstractSet類。CopyOnWriteArraySet 內部包含一個CopyOnWriteArrayList對象(聚合關係),它是通過CopyOnWriteArrayList實現的。

JUC包中Map實現類

JUC集合包中Map的實現類包括: ConcurrentHashMap和ConcurrentSkipListMap。它們的框架如下圖所示:

這裏寫圖片描述

  • ConcurrentHashMap是線程安全的哈希表(相當於線程安全的HashMap)它繼承於AbstractMap類,並且實現ConcurrentMap接口。ConcurrentHashMap是通過“鎖分段”來實現的,它支持併發。

    -ConcurrentSkipListMap是線程安全的有序的哈希表(相當於線程安全的TreeMap); 它繼承於AbstractMap類,並且實現ConcurrentNavigableMap接口。ConcurrentSkipListMap是通過“跳錶”來實現的,它支持併發。

  • ConcurrentSkipListSet是線程安全的有序的集合(相當於線程安全的TreeSet)它繼承於AbstractSet,並實現了NavigableSet接口。ConcurrentSkipListSet是通過ConcurrentSkipListMap實現的,它也支持併發。

JUC包中Queue實現類

JUC集合包中Queue的實現類包括: ArrayBlockingQueue, LinkedBlockingQueue, LinkedBlockingDeque, ConcurrentLinkedQueue和ConcurrentLinkedDeque。它們的框架如下圖所示:

這裏寫圖片描述

(01) ArrayBlockingQueue**是數組實現的線程安全的有界的阻塞隊列。**

(02) LinkedBlockingQueue是單向鏈表實現的(指定大小)阻塞隊列,該隊列按 FIFO(先進先出)排序元素。

(03) LinkedBlockingDeque是雙向鏈表實現的(指定大小)雙向併發阻塞隊列,該阻塞隊列同時支持FIFO和FILO兩種操作方式。

(04) ConcurrentLinkedQueue**是單向鏈表實現的無界隊列,該隊列按 FIFO(先進先出)排序元素。**

(05) ConcurrentLinkedDeque**是雙向鏈表實現的無界隊列,該隊列同時支持FIFO和FILO兩種操作方式。**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章