并發(fā)容器的原理想许,七大并發(fā)容器詳解、及使用場景

并發(fā)容器的由來

在Java并發(fā)編程中断序,經(jīng)常聽到Java集合類流纹,同步容器、并發(fā)容器违诗,那么他們有哪些具體分類漱凝,以及各自之間的區(qū)別和優(yōu)劣呢?

只有把這些梳理清楚了诸迟,你才能真正掌握在高并發(fā)的環(huán)境下茸炒,正確使用好并發(fā)容器宇挫,我們先從Java集合類西傀,同步容器談起。

file
1.什么是同步容器

Java的集合容器框架中奈揍,主要有四大類別:List绅项、Set贮尖、Queue、Map趁怔,大家熟知的這些集合類ArrayList湿硝、LinkedList、HashMap這些容器都是非線程安全的润努。

如果有多個線程并發(fā)地訪問這些容器時关斜,就會出現(xiàn)問題。因此铺浇,在編寫程序時痢畜,在多線程環(huán)境下必須要求程序員手動地在任何訪問到這些容器的地方進(jìn)行同步處理,這樣導(dǎo)致在使用這些容器的時候非常地不方便鳍侣。

所以丁稀,Java先提供了同步容器供用戶使用。

同步容器可以簡單地理解為通過synchronized來實現(xiàn)同步的容器倚聚,比如Vector线衫、Hashtable以及SynchronizedList等容器。

2.同步容器惑折,主要的分類:
  • Vector
  • Stack
  • HashTable
  • Collections.synchronized方法生成
同步容器面臨的問題

可以通過查看Vector授账,Hashtable等這些同步容器的實現(xiàn)代碼,可以看到這些容器實現(xiàn)線程安全的方式就是將它們的狀態(tài)封裝起來惨驶,并在需要同步的方法上加上關(guān)鍵字synchronized白热。

這樣做的代價是削弱了并發(fā)性,當(dāng)多個線程共同競爭容器級的鎖時粗卜,吞吐量就會降低屋确。

例如: HashTable只要有一條線程獲取了容器的鎖之后,其他所有的線程訪問同步函數(shù)都會被阻塞续扔,因此同一時刻只能有一條線程訪問同步函數(shù)攻臀。

file

因此為了解決同步容器的性能問題,所以才有了并發(fā)容器测砂。

什么是并發(fā)容器

java.util.concurrent包中提供了多種并發(fā)類容器茵烈。

并發(fā)類容器是專門針對多線程并發(fā)設(shè)計的,使用了鎖分段技術(shù)砌些,只對操作的位置進(jìn)行同步操作呜投,但是其他沒有操作的位置其他線程仍然可以訪問,提高了程序的吞吐量存璃。

采用了CAS算法和部分代碼使用synchronized鎖保證線程安全仑荐。

并發(fā)容器有哪些分類

file
1.ConcurrentHashMap

對應(yīng)的非并發(fā)容器:HashMap

目標(biāo):代替Hashtable、synchronizedMap纵东,支持復(fù)合操作

原理:JDK6中采用一種更加細(xì)粒度的加鎖機(jī)制Segment“分段鎖”粘招,JDK8中采用CAS無鎖算法。

2.CopyOnWriteArrayList

對應(yīng)的非并發(fā)容器:ArrayList

目標(biāo):代替Vector偎球、synchronizedList

原理:利用高并發(fā)往往是讀多寫少的特性洒扎,對讀操作不加鎖辑甜,對寫操作,先復(fù)制一份新的集合袍冷,在新的集合上面修改磷醋,然后將新集合賦值給舊的引用,并通過volatile 保證其可見性胡诗,當(dāng)然寫操作的鎖是必不可少的了邓线。

3.CopyOnWriteArraySet

對應(yīng)的非并發(fā)容器:HashSet

目標(biāo):代替synchronizedSet

原理:基于CopyOnWriteArrayList實現(xiàn),其唯一的不同是在add時調(diào)用的是CopyOnWriteArrayList的addIfAbsent方法煌恢,其遍歷當(dāng)前Object數(shù)組骇陈,如Object數(shù)組中已有了當(dāng)前元素,則直接返回瑰抵,如果沒有則放入Object數(shù)組的尾部你雌,并返回。

4.ConcurrentSkipListMap

對應(yīng)的非并發(fā)容器:TreeMap

目標(biāo):代替synchronizedSortedMap(TreeMap)

原理:Skip list(跳表)是一種可以代替平衡樹的數(shù)據(jù)結(jié)構(gòu)谍憔,默認(rèn)是按照Key值升序的匪蝙。

5.ConcurrentSkipListSet

對應(yīng)的非并發(fā)容器:TreeSet

目標(biāo):代替synchronizedSortedSet

原理:內(nèi)部基于ConcurrentSkipListMap實現(xiàn)

6.ConcurrentLinkedQueue

不會阻塞的隊列

對應(yīng)的非并發(fā)容器:Queue

原理:基于鏈表實現(xiàn)的FIFO隊列(LinkedList的并發(fā)版本)

7.LinkedBlockingQueue、ArrayBlockingQueue习贫、PriorityBlockingQueue

對應(yīng)的非并發(fā)容器:BlockingQueue

特點:拓展了Queue逛球,增加了可阻塞的插入和獲取等操作

原理:通過ReentrantLock實現(xiàn)線程安全,通過Condition實現(xiàn)阻塞和喚醒

實現(xiàn)類:

  • LinkedBlockingQueue:基于鏈表實現(xiàn)的可阻塞的FIFO隊列
  • ArrayBlockingQueue:基于數(shù)組實現(xiàn)的可阻塞的FIFO隊列
  • PriorityBlockingQueue:按優(yōu)先級排序的隊列

ConcurrentHashMap的實現(xiàn)

file

HashMap,Hashtable與ConcurrentHashMap都是實現(xiàn)的哈希表數(shù)據(jù)結(jié)構(gòu)苫昌,在隨機(jī)讀取的時候效率很高颤绕。

Hashtable實現(xiàn)同步是利用synchronized關(guān)鍵字進(jìn)行鎖定的,其是針對整張哈希表進(jìn)行鎖定的祟身,即每次鎖住整張表讓線程獨占奥务,在線程安全的背后是巨大的浪費。

ConcurrentHashMap和Hashtable主要區(qū)別就是圍繞著鎖的粒度進(jìn)行區(qū)別以及如何區(qū)鎖定袜硫。

上圖中氯葬,左邊是Hashtable的實現(xiàn)方式,可以看到鎖住整個哈希表婉陷;而右邊則是ConcurrentHashMap的實現(xiàn)方式帚称,單獨鎖住每一個桶(segment).ConcurrentHashMap將哈希表分為16個桶(默認(rèn)值),諸如get(),put(),remove()等常用操作只鎖當(dāng)前需要用到的桶,而size()才鎖定整張表秽澳。

原來只能一個線程進(jìn)入闯睹,現(xiàn)在卻能同時接受16個寫線程并發(fā)進(jìn)入(寫線程需要鎖定,而讀線程幾乎不受限制)担神。

所以楼吃,才有了并發(fā)性的極大提升。

高并發(fā)編程,除了并發(fā)容器孩锡,還會涉及到并發(fā)工具類:CountDownLatch等酷宵,后續(xù)將詳細(xì)的介紹并發(fā)工具類,以及ConcurrentHashMap的底層實現(xiàn)細(xì)節(jié)浮创,不僅要知其然,還要知其所以然忧吟,這樣才能更好的掌握好高并發(fā)編程。

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布斩披!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市讹俊,隨后出現(xiàn)的幾起案子垦沉,更是在濱河造成了極大的恐慌,老刑警劉巖仍劈,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厕倍,死亡現(xiàn)場離奇詭異,居然都是意外死亡贩疙,警方通過查閱死者的電腦和手機(jī)讹弯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來这溅,“玉大人组民,你說我怎么就攤上這事”ィ” “怎么了臭胜?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長癞尚。 經(jīng)常有香客問我耸三,道長,這世上最難降的妖魔是什么浇揩? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任仪壮,我火速辦了婚禮,結(jié)果婚禮上胳徽,老公的妹妹穿的比我還像新娘积锅。我一直安慰自己,他們只是感情好膜廊,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布乏沸。 她就那樣靜靜地躺著,像睡著了一般爪瓜。 火紅的嫁衣襯著肌膚如雪蹬跃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音蝶缀,去河邊找鬼丹喻。 笑死,一個胖子當(dāng)著我的面吹牛翁都,可吹牛的內(nèi)容都是我干的碍论。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼柄慰,長吁一口氣:“原來是場噩夢啊……” “哼鳍悠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坐搔,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤藏研,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后概行,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蠢挡,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年凳忙,在試婚紗的時候發(fā)現(xiàn)自己被綠了业踏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡涧卵,死狀恐怖勤家,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情艺演,我是刑警寧澤却紧,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站胎撤,受9級特大地震影響晓殊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜伤提,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一巫俺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肿男,春花似錦介汹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至如庭,卻和暖如春叹卷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工骤竹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留帝牡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓蒙揣,卻偏偏與公主長得像靶溜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子懒震,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容