Java concurrency之集合_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java集合包
Java集合主體內(nèi)容包括Collection集合和Map類(lèi);而Collection集合又可以劃分為L(zhǎng)ist(隊(duì)列)和Set(集合)。
1. List的實(shí)現(xiàn)類(lèi)主要有: LinkedList, ArrayList, Vector, Stack。
(01) LinkedList是雙向鏈表實(shí)現(xiàn)的雙端隊(duì)列;它不是線(xiàn)程安全的,只適用于單線(xiàn)程。
(02) ArrayList是數(shù)組實(shí)現(xiàn)的隊(duì)列,它是一個(gè)動(dòng)態(tài)數(shù)組;它也不是線(xiàn)程安全的,只適用于單線(xiàn)程。
(03) Vector是數(shù)組實(shí)現(xiàn)的矢量隊(duì)列,它也一個(gè)動(dòng)態(tài)數(shù)組;不過(guò)和ArrayList不同的是,Vector是線(xiàn)程安全的,它支持并發(fā)。
(04) Stack是Vector實(shí)現(xiàn)的棧;和Vector一樣,它也是線(xiàn)程安全的。
2. Set的實(shí)現(xiàn)類(lèi)主要有: HastSet和TreeSet。
(01) HashSet是一個(gè)沒(méi)有重復(fù)元素的集合,它通過(guò)HashMap實(shí)現(xiàn)的;HashSet不是線(xiàn)程安全的,只適用于單線(xiàn)程。
(02) TreeSet也是一個(gè)沒(méi)有重復(fù)元素的集合,不過(guò)和HashSet不同的是,TreeSet中的元素是有序的;它是通過(guò)TreeMap實(shí)現(xiàn)的;TreeSet也不是線(xiàn)程安全的,只適用于單線(xiàn)程。
3.Map的實(shí)現(xiàn)類(lèi)主要有: HashMap,WeakHashMap, Hashtable和TreeMap。
(01) HashMap是存儲(chǔ)“鍵-值對(duì)”的哈希表;它不是線(xiàn)程安全的,只適用于單線(xiàn)程。
(02) WeakHashMap是也是哈希表;和HashMap不同的是,HashMap的“鍵”是強(qiáng)引用類(lèi)型,而WeakHashMap的“鍵”是弱引用類(lèi)型,也就是說(shuō)當(dāng)WeakHashMap 中的某個(gè)鍵不再正常使用時(shí),會(huì)被從WeakHashMap中被自動(dòng)移除。WeakHashMap也不是線(xiàn)程安全的,只適用于單線(xiàn)程。
(03) Hashtable也是哈希表;和HashMap不同的是,Hashtable是線(xiàn)程安全的,支持并發(fā)。
(04) TreeMap也是哈希表,不過(guò)TreeMap中的“鍵-值對(duì)”是有序的,它是通過(guò)R-B Tree(紅黑樹(shù))實(shí)現(xiàn)的;TreeMap不是線(xiàn)程安全的,只適用于單線(xiàn)程。
更多關(guān)于這些集合類(lèi)的介紹,可以參考“Java 集合系列目錄(Category)”。
為了方便,我們將前面介紹集合類(lèi)統(tǒng)稱(chēng)為”java集合包“。java集合包大多是“非線(xiàn)程安全的”,雖然可以通過(guò)Collections工具類(lèi)中的方法獲取java集合包對(duì)應(yīng)的同步類(lèi),但是這些同步類(lèi)的并發(fā)效率并不是很高。為了更好的支持高并發(fā)任務(wù),并發(fā)大師Doug Lea在JUC(java.util.concurrent)包中添加了java集合包中單線(xiàn)程類(lèi)的對(duì)應(yīng)的支持高并發(fā)的類(lèi)。例如,ArrayList對(duì)應(yīng)的高并發(fā)類(lèi)是CopyOnWriteArrayList,HashMap對(duì)應(yīng)的高并發(fā)類(lèi)是ConcurrentHashMap,等等。
JUC包在添加”java集合包“對(duì)應(yīng)的高并發(fā)類(lèi)時(shí),為了保持API接口的一致性,使用了”Java集合包“中的框架。例如,CopyOnWriteArrayList實(shí)現(xiàn)了“Java集合包”中的List接口,HashMap繼承了“java集合包”中的AbstractMap類(lèi),等等。得益于“JUC包使用了Java集合包中的類(lèi)”,如果我們了解了Java集合包中的類(lèi)的思想之后,理解JUC包中的類(lèi)也相對(duì)容易;理解時(shí),最大的難點(diǎn)是,對(duì)JUC包是如何添加對(duì)“高并發(fā)”的支持的!
JUC中的集合類(lèi)
下面,我們先了解JUC包中集合類(lèi)的框架;為了方便講訴,我將JUC包中的集合類(lèi)劃分為3部分來(lái)進(jìn)行說(shuō)明。在簡(jiǎn)單的了解JUC包中集合類(lèi)的框架之后,后面的章節(jié)再逐步對(duì)各個(gè)類(lèi)進(jìn)行介紹。
1. List和Set
JUC集合包中的List和Set實(shí)現(xiàn)類(lèi)包括: CopyOnWriteArrayList, CopyOnWriteArraySet和ConcurrentSkipListSet。
ConcurrentSkipListSet稍后在說(shuō)明Map時(shí)再說(shuō)明,CopyOnWriteArrayList 和 CopyOnWriteArraySet的框架如下圖所示:

(01) CopyOnWriteArrayList相當(dāng)于線(xiàn)程安全的ArrayList,它實(shí)現(xiàn)了List接口。CopyOnWriteArrayList是支持高并發(fā)的。
(02) CopyOnWriteArraySet相當(dāng)于線(xiàn)程安全的HashSet,它繼承于AbstractSet類(lèi)。CopyOnWriteArraySet內(nèi)部包含一個(gè)CopyOnWriteArrayList對(duì)象,它是通過(guò)CopyOnWriteArrayList實(shí)現(xiàn)的。
2. Map
JUC集合包中Map的實(shí)現(xiàn)類(lèi)包括: ConcurrentHashMap和ConcurrentSkipListMap。它們的框架如下圖所示:

(01) ConcurrentHashMap是線(xiàn)程安全的哈希表(相當(dāng)于線(xiàn)程安全的HashMap);它繼承于AbstractMap類(lèi),并且實(shí)現(xiàn)ConcurrentMap接口。ConcurrentHashMap是通過(guò)“鎖分段”來(lái)實(shí)現(xiàn)的,它支持并發(fā)。
(02) ConcurrentSkipListMap是線(xiàn)程安全的有序的哈希表(相當(dāng)于線(xiàn)程安全的TreeMap); 它繼承于AbstractMap類(lèi),并且實(shí)現(xiàn)ConcurrentNavigableMap接口。ConcurrentSkipListMap是通過(guò)“跳表”來(lái)實(shí)現(xiàn)的,它支持并發(fā)。
(03) ConcurrentSkipListSet是線(xiàn)程安全的有序的集合(相當(dāng)于線(xiàn)程安全的TreeSet);它繼承于AbstractSet,并實(shí)現(xiàn)了NavigableSet接口。ConcurrentSkipListSet是通過(guò)ConcurrentSkipListMap實(shí)現(xiàn)的,它也支持并發(fā)。
3. Queue
JUC集合包中Queue的實(shí)現(xiàn)類(lèi)包括: ArrayBlockingQueue, LinkedBlockingQueue, LinkedBlockingDeque, ConcurrentLinkedQueue和ConcurrentLinkedDeque。它們的框架如下圖所示:

(01) ArrayBlockingQueue是數(shù)組實(shí)現(xiàn)的線(xiàn)程安全的有界的阻塞隊(duì)列。
(02) LinkedBlockingQueue是單向鏈表實(shí)現(xiàn)的(指定大小)阻塞隊(duì)列,該隊(duì)列按 FIFO(先進(jìn)先出)排序元素。
(03) LinkedBlockingDeque是雙向鏈表實(shí)現(xiàn)的(指定大小)雙向并發(fā)阻塞隊(duì)列,該阻塞隊(duì)列同時(shí)支持FIFO和FILO兩種操作方式。
(04) ConcurrentLinkedQueue是單向鏈表實(shí)現(xiàn)的無(wú)界隊(duì)列,該隊(duì)列按 FIFO(先進(jìn)先出)排序元素。
(05) ConcurrentLinkedDeque是雙向鏈表實(shí)現(xiàn)的無(wú)界隊(duì)列,該隊(duì)列同時(shí)支持FIFO和FILO兩種操作方式。
- Java concurrency集合之CopyOnWriteArraySet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java concurrency集合之ConcurrentLinkedQueue_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java concurrency集合之ConcurrentSkipListMap_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java concurrency集合之ConcurrentSkipListSet_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java concurrency集合之ConcurrentHashMap_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java concurrency集合之ArrayBlockingQueue_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java concurrency集合之 CopyOnWriteArrayList_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java concurrency集合之LinkedBlockingDeque_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
相關(guān)文章
Java編程中二維數(shù)組的初始化和基本操作實(shí)例
這篇文章主要介紹了Java編程中二維數(shù)組的初始化和基本操作實(shí)例,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
JFinal 調(diào)用存儲(chǔ)過(guò)程的步驟
這篇文章主要介紹了JFinal 調(diào)用存儲(chǔ)過(guò)程的步驟,幫助大家更好的理解和學(xué)習(xí)使用JFinal,感興趣的朋友可以了解下2021-03-03
關(guān)于訪問(wèn)后端接口報(bào)404錯(cuò)誤問(wèn)題的解決方法(全網(wǎng)最細(xì)!)
404頁(yè)面的出現(xiàn)會(huì)降低用戶(hù)體驗(yàn),那么導(dǎo)致404頁(yè)面出現(xiàn)的原因是什么呢?這篇文章主要給大家介紹了關(guān)于訪問(wèn)后端接口報(bào)404錯(cuò)誤問(wèn)題的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
Mybatis-plus插入數(shù)據(jù)遇到主鍵沒(méi)有默認(rèn)值的情況
這篇文章主要介紹了Mybatis-plus插入數(shù)據(jù)遇到主鍵沒(méi)有默認(rèn)值的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Spring Cloud學(xué)習(xí)教程之Zuul統(tǒng)一異常處理與回退
Spring Cloud Zuul對(duì)異常的處理整體來(lái)說(shuō)還是比較方便的,流程也比較清晰,下面這篇文章主要給大家介紹了關(guān)于Spring Cloud學(xué)習(xí)教程之Zuul統(tǒng)一異常處理與回退的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
實(shí)例分析java開(kāi)啟線(xiàn)程的方法
在本文里我們通過(guò)實(shí)例給大家講解了JAVA開(kāi)啟線(xiàn)程的方法和相關(guān)知識(shí)點(diǎn),需要的朋友們跟著學(xué)習(xí)下。2019-03-03

