1. 程式人生 > >Java多執行緒系列--【JUC集合01】- 框架

Java多執行緒系列--【JUC集合01】- 框架

參考:http://www.cnblogs.com/skywang12345/p/3498454.html

概要

之前,在""中,講解了Java集合包中的各個類。接下來,將展開對JUC包中的集合進行學習。在學習之前,先溫習一下"Java集合包"。本章內容包括:
Java集合包
JUC中的集合類

Java集合包

在“Java 集合系列01之 總體框架”中,介紹java集合的架構。主體內容包括Collection集合和Map類;而Collection集合又可以劃分為List(佇列)和Set(集合)。

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

(01) LinkedList是雙向連結串列實現的雙端佇列;它不是執行緒安全的,只適用於單執行緒。
(02) ArrayList是陣列實現的佇列,它是一個動態陣列;它也不是執行緒安全的,只適用於單執行緒。
(03) Vector是陣列實現的向量佇列,它也一個動態陣列;不過和ArrayList不同的是,Vector是執行緒安全的,它支援併發。
(04) Stack是Vector實現的棧;和Vector一樣,它也是執行緒安全的。

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

(01) HashSet是一個沒有重複元素的集合,它通過HashMap實現的;HashSet不是執行緒安全的,只適用於單執行緒。


(02) TreeSet也是一個沒有重複元素的集合,不過和HashSet不同的是,TreeSet中的元素是有序的;它是通過TreeMap實現的;TreeSet也不是執行緒安全的,只適用於單執行緒。

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

(01) HashMap是儲存“鍵-值對”的雜湊表;它不是執行緒安全的,只適用於單執行緒。
(02) WeakHashMap是也是雜湊表;和HashMap不同的是,HashMap的“鍵”是強引用型別,而WeakHashMap的“鍵”是弱引用型別,也就是說當WeakHashMap 中的某個鍵不再正常使用時,會被從WeakHashMap中被自動移除。WeakHashMap也不是執行緒安全的,只適用於單執行緒。


(03) Hashtable也是雜湊表;和HashMap不同的是,Hashtable是執行緒安全的,支援併發。
(04) TreeMap也是雜湊表,不過TreeMap中的“鍵-值對”是有序的,它是通過R-B Tree(紅黑樹)實現的;TreeMap不是執行緒安全的,只適用於單執行緒。
更多關於這些集合類的介紹,可以參考“Java 集合系列目錄(Category)”。

    為了方便,我們將前面介紹集合類統稱為”java集合包“。java集合包大多是“非執行緒安全的”,雖然可以通過Collections工具類中的方法獲取java集合包對應的同步類,但是這些同步類的併發效率並不是很高。為了更好的支援高併發任務,併發大師Doug Lea在JUC(java.util.concurrent)包中添加了java集合包中單執行緒類的對應的支援高併發的類。例如,ArrayList對應的高併發類是CopyOnWriteArrayList,HashMap對應的高併發類是ConcurrentHashMap,等等。

    JUC包在新增”java集合包“對應的高併發類時,為了保持API介面的一致性,使用了”Java集合包“中的框架。例如,CopyOnWriteArrayList實現了“Java集合包”中的List介面,HashMap繼承了“java集合包”中的AbstractMap類,等等。得益於“JUC包使用了Java集合包中的類”,如果我們瞭解了Java集合包中的類的思想之後,理解JUC包中的類也相對容易;理解時,最大的難點是,對JUC包是如何新增對“高併發”的支援的!

JUC中的集合類

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

1. List和Set

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

(01) CopyOnWriteArrayList相當於執行緒安全的ArrayList,它實現了List介面。CopyOnWriteArrayList是支援高併發的。
(02) CopyOnWriteArraySet相當於執行緒安全的HashSet,它繼承於AbstractSet類。CopyOnWriteArraySet內部包含一個CopyOnWriteArrayList物件,它是通過CopyOnWriteArrayList實現的。


2. Map

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

(01) ConcurrentHashMap是執行緒安全的雜湊表(相當於執行緒安全的HashMap);它繼承於AbstractMap類,並且實現ConcurrentMap介面。ConcurrentHashMap是通過“鎖分段”來實現的,它支援併發。
(02) ConcurrentSkipListMap是執行緒安全的有序的雜湊表(相當於執行緒安全的TreeMap); 它繼承於AbstractMap類,並且實現ConcurrentNavigableMap介面。ConcurrentSkipListMap是通過“跳錶”來實現的,它支援併發。
(03) ConcurrentSkipListSet是執行緒安全的有序的集合(相當於執行緒安全的TreeSet);它繼承於AbstractSet,並實現了NavigableSet介面。ConcurrentSkipListSet是通過ConcurrentSkipListMap實現的,它也支援併發。

3. Queue

JUC集合包中Queue的實現類包括: ArrayBlockingQueueLinkedBlockingQueueLinkedBlockingDequeConcurrentLinkedQueueConcurrentLinkedDeque。它們的框架如下圖所示:

(01) ArrayBlockingQueue是陣列實現的執行緒安全的有界的阻塞佇列。
(02) LinkedBlockingQueue是單向連結串列實現的(指定大小)阻塞佇列,該佇列按 FIFO(先進先出)排序元素。
(03) LinkedBlockingDeque是雙向連結串列實現的(指定大小)雙向併發阻塞佇列,該阻塞佇列同時支援FIFO和FILO兩種操作方式。
(04) ConcurrentLinkedQueue是單向連結串列實現的無界佇列,該佇列按 FIFO(先進先出)排序元素。
(05) ConcurrentLinkedDeque是雙向連結串列實現的無界佇列,該佇列同時支援FIFO和FILO兩種操作方式。


接下來,將逐個對JUC包中的集合類進行學習。


概要

之前,在""中,講解了Java集合包中的各個類。接下來,將展開對JUC包中的集合進行學習。在學習之前,先溫習一下"Java集合包"。本章內容包括:
Java集合包
JUC中的集合類

Java集合包

在“Java 集合系列01之 總體框架”中,介紹java集合的架構。主體內容包括Collection集合和Map類;而Collection集合又可以劃分為List(佇列)和Set(集合)。

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

(01) LinkedList是雙向連結串列實現的雙端佇列;它不是執行緒安全的,只適用於單執行緒。
(02) ArrayList是陣列實現的佇列,它是一個動態陣列;它也不是執行緒安全的,只適用於單執行緒。
(03) Vector是陣列實現的向量佇列,它也一個動態陣列;不過和ArrayList不同的是,Vector是執行緒安全的,它支援併發。
(04) Stack是Vector實現的棧;和Vector一樣,它也是執行緒安全的。

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

(01) HashSet是一個沒有重複元素的集合,它通過HashMap實現的;HashSet不是執行緒安全的,只適用於單執行緒。
(02) TreeSet也是一個沒有重複元素的集合,不過和HashSet不同的是,TreeSet中的元素是有序的;它是通過TreeMap實現的;TreeSet也不是執行緒安全的,只適用於單執行緒。

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

(01) HashMap是儲存“鍵-值對”的雜湊表;它不是執行緒安全的,只適用於單執行緒。
(02) WeakHashMap是也是雜湊表;和HashMap不同的是,HashMap的“鍵”是強引用型別,而WeakHashMap的“鍵”是弱引用型別,也就是說當WeakHashMap 中的某個鍵不再正常使用時,會被從WeakHashMap中被自動移除。WeakHashMap也不是執行緒安全的,只適用於單執行緒。
(03) Hashtable也是雜湊表;和HashMap不同的是,Hashtable是執行緒安全的,支援併發。
(04) TreeMap也是雜湊表,不過TreeMap中的“鍵-值對”是有序的,它是通過R-B Tree(紅黑樹)實現的;TreeMap不是執行緒安全的,只適用於單執行緒。
更多關於這些集合類的介紹,可以參考“Java 集合系列目錄(Category)”。

    為了方便,我們將前面介紹集合類統稱為”java集合包“。java集合包大多是“非執行緒安全的”,雖然可以通過Collections工具類中的方法獲取java集合包對應的同步類,但是這些同步類的併發效率並不是很高。為了更好的支援高併發任務,併發大師Doug Lea在JUC(java.util.concurrent)包中添加了java集合包中單執行緒類的對應的支援高併發的類。例如,ArrayList對應的高併發類是CopyOnWriteArrayList,HashMap對應的高併發類是ConcurrentHashMap,等等。

    JUC包在新增”java集合包“對應的高併發類時,為了保持API介面的一致性,使用了”Java集合包“中的框架。例如,CopyOnWriteArrayList實現了“Java集合包”中的List介面,HashMap繼承了“java集合包”中的AbstractMap類,等等。得益於“JUC包使用了Java集合包中的類”,如果我們瞭解了Java集合包中的類的思想之後,理解JUC包中的類也相對容易;理解時,最大的難點是,對JUC包是如何新增對“高併發”的支援的!

JUC中的集合類

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

1. List和Set

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

(01) CopyOnWriteArrayList相當於執行緒安全的ArrayList,它實現了List介面。CopyOnWriteArrayList是支援高併發的。
(02) CopyOnWriteArraySet相當於執行緒安全的HashSet,它繼承於AbstractSet類。CopyOnWriteArraySet內部包含一個CopyOnWriteArrayList物件,它是通過CopyOnWriteArrayList實現的。


2. Map

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

(01) ConcurrentHashMap是執行緒安全的雜湊表(相當於執行緒安全的HashMap);它繼承於AbstractMap類,並且實現ConcurrentMap介面。ConcurrentHashMap是通過“鎖分段”來實現的,它支援併發。
(02) ConcurrentSkipListMap是執行緒安全的有序的雜湊表(相當於執行緒安全的TreeMap); 它繼承於AbstractMap類,並且實現ConcurrentNavigableMap介面。ConcurrentSkipListMap是通過“跳錶”來實現的,它支援併發。
(03) ConcurrentSkipListSet是執行緒安全的有序的集合(相當於執行緒安全的TreeSet);它繼承於AbstractSet,並實現了NavigableSet介面。ConcurrentSkipListSet是通過ConcurrentSkipListMap實現的,它也支援併發。

3. Queue

JUC集合包中Queue的實現類包括: ArrayBlockingQueueLinkedBlockingQueueLinkedBlockingDequeConcurrentLinkedQueueConcurrentLinkedDeque。它們的框架如下圖所示:

(01) ArrayBlockingQueue是陣列實現的執行緒安全的有界的阻塞佇列。
(02) LinkedBlockingQueue是單向連結串列實現的(指定大小)阻塞佇列,該佇列按 FIFO(先進先出)排序元素。
(03) LinkedBlockingDeque是雙向連結串列實現的(指定大小)雙向併發阻塞佇列,該阻塞佇列同時支援FIFO和FILO兩種操作方式。
(04) ConcurrentLinkedQueue是單向連結串列實現的無界佇列,該佇列按 FIFO(先進先出)排序元素。
(05) ConcurrentLinkedDeque是雙向連結串列實現的無界佇列,該佇列同時支援FIFO和FILO兩種操作方式。


接下來,將逐個對JUC包中的集合類進行學習。