線程基礎(chǔ)(二十八)

本文作者:王一飛婿牍,叩丁狼高級(jí)講師监嗜。原創(chuàng)文章谐檀,轉(zhuǎn)載請(qǐng)注明出處。

到這裁奇, 線程的并發(fā)容器介紹就完成了桐猬, 來做一個(gè)大總結(jié):

List集合
SynchronizedList :一個(gè)由普通list轉(zhuǎn)換而來的線程安全集合

List list = Collections.synchronizedList(new LinkedList(...));

CopyOnWriteArrayList :一種讀寫安全的ArrayList集合

CopyOnWriteArrayList類是線程安全的容器,但它的安全是有一定的限制的刽肠。他的線程安全操作針對(duì)是并發(fā)環(huán)境下線程讀與寫安全溃肪。簡(jiǎn)單的講, 它只能保證, 一邊線程主讀(遍歷/獲取), 一邊線程主寫(添加/刪除/修改)操作上的安全。如果一邊線程讀寫復(fù)合操作音五,另一邊線程也讀寫復(fù)合操作惫撰,那它也無能為力啦。

Map集合
SynchronizedMap:一個(gè)由普通Map轉(zhuǎn)換而來的線程安全map集合

Map synchronizedMap = Collections.synchronizedMap(new HashMap());

ConcurrentHashMap:jdk7以前:一種將Map分段(Segment)鎖定的線程按照Map jdk8以后:一種使用Node + CAS + Synchronized 保證安全的Map

jdk7以前:
ConcurrentHashMap和HashMap設(shè)計(jì)思路差不多躺涝,但是為支持并發(fā)操作厨钻,做了一定的改進(jìn),ConcurrentHashMap引入Segment 的概念坚嗜,目的是將map拆分成多個(gè)Segment(默認(rèn)16個(gè))莉撇。操作ConcurrentHashMap細(xì)化到操作某一個(gè)Segment。在多線程環(huán)境下惶傻,不同線程操作不同的Segment,他們互不影響其障,這便可實(shí)現(xiàn)并發(fā)操作银室。
jdk8以后:
jdk8版本的ConcurrentHashMap直接拋棄了Segment的設(shè)計(jì),采用了較為輕捷的Node + CAS + Synchronized技術(shù)組合設(shè)計(jì)励翼,保證線程安全蜈敢。

Queue隊(duì)列
阻塞類:
ArrayBlockingQueue :一個(gè)由數(shù)組結(jié)構(gòu)組成的有界阻塞隊(duì)列。

ArrayBlockingQueue 底層是一個(gè)有界數(shù)組汽抚,遵循FIFO原則抓狭,對(duì)進(jìn)入的元素進(jìn)行排序,先進(jìn)先出造烁。其使用ReentrantLock鎖否过,再配合兩種Condition實(shí)現(xiàn)隊(duì)列的線程安全操作。并發(fā)環(huán)境下ArrayBlockingQueue 使用頻率較高,另外,其還支持公平與非公平2種操作策略惭蟋,在創(chuàng)建對(duì)象時(shí)通過構(gòu)造函數(shù)將fair參數(shù)設(shè)置為true/false即可苗桂,需要注意的是,如果fair設(shè)置為false告组,表示持有公平鎖煤伟,這種操作會(huì)降低系統(tǒng)吞吐量,慎用。

LinkedBlockingQueue :一個(gè)由鏈表結(jié)構(gòu)組成的有界阻塞隊(duì)列便锨。

LinkedBlockingQueue 一個(gè)基于鏈表而實(shí)現(xiàn)的有界阻塞隊(duì)列围辙。遵循先進(jìn)先出原則,由隊(duì)頭入列放案,再從隊(duì)尾出列姚建。具體操作上跟ArrayBlockingQueue類似,區(qū)別在于底層維護(hù)數(shù)據(jù)上卿叽,LinkedBlockingQueue底層是一個(gè)鏈接桥胞,而ArrayBlockingQueue是一個(gè)數(shù)組。

LinkedBlockingDeque:一個(gè)由鏈表結(jié)構(gòu)組成的雙向阻塞隊(duì)列考婴。

LinkedBlockingDeque 跟LinkedBlockingQueue 實(shí)現(xiàn)原理一樣,區(qū)別是它是雙向的

PriorityBlockingQueue :一個(gè)支持優(yōu)先級(jí)排序的無界阻塞隊(duì)列贩虾。

PriorityBlockingQueue 是有一個(gè)帶有優(yōu)先級(jí)級(jí)別的無界阻塞隊(duì)列,不支持null元素入列沥阱,并且要求隊(duì)列對(duì)象必須為可以比較對(duì)象缎罢。這點(diǎn)跟PriorityQueue類 類似,區(qū)別是PriorityBlockingQueue 帶有阻塞功能考杉。

DelayQueue:一個(gè)具有延時(shí)等待效果無界阻塞隊(duì)列策精。

DelayQueue一個(gè)無界阻塞隊(duì)列,里面元素都實(shí)現(xiàn)Delayed接口崇棠,要求實(shí)現(xiàn)延期策略方法(getDelay)咽袜。在操作隊(duì)列時(shí),只有在延遲期滿時(shí)才能從隊(duì)列中提取元素枕稀。如果所有元素延遲都還沒有期滿询刹,則隊(duì)列沒有頭部,使用poll時(shí)將返回 null萎坷。當(dāng)元素到期,而該元素不是頭部元素,繼續(xù)等待.

SynchronousQueue:一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列凹联。

SynchronousQueue一個(gè)不存儲(chǔ)元素的阻塞隊(duì)列,支持公平鎖和非公平鎖.每一次操作必須配置,即一次put操作必須等待一次take操作哆档,否則不能添加元素蔽挠。

非阻塞類:
ConcurrentLinkedQueue:一個(gè)基于鏈表的無界線程安全的隊(duì)列

ConcurrentLinkedQueue 是一個(gè)基于鏈接節(jié)點(diǎn)的無界線程安全的隊(duì)列,按照先進(jìn)先出原則對(duì)元素進(jìn)行排序瓜浸。新元素從隊(duì)列尾部插入澳淑,而獲取隊(duì)列元素,則需要從隊(duì)列頭部獲取插佛。

PriorityQueue:一個(gè)基于優(yōu)先級(jí)的無界線程不安全隊(duì)列

PriorityQueue 一個(gè)基于優(yōu)先級(jí)的無界優(yōu)先級(jí)隊(duì)列偶惠。優(yōu)先級(jí)隊(duì)列的元素按照其自然順序進(jìn)行排序,或者根據(jù)構(gòu)造隊(duì)列時(shí)提供的 Comparator 進(jìn)行排序朗涩,具體取決于所使用的構(gòu)造方法忽孽。該隊(duì)列不允許使用 null 元素也不允許插入不可比較的對(duì)象(沒有實(shí)現(xiàn)Comparable接口的對(duì)象)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兄一,隨后出現(xiàn)的幾起案子厘线,更是在濱河造成了極大的恐慌,老刑警劉巖出革,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件造壮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡骂束,警方通過查閱死者的電腦和手機(jī)耳璧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來展箱,“玉大人旨枯,你說我怎么就攤上這事』斐郏” “怎么了攀隔?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長栖榨。 經(jīng)常有香客問我昆汹,道長,這世上最難降的妖魔是什么婴栽? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任满粗,我火速辦了婚禮,結(jié)果婚禮上愚争,老公的妹妹穿的比我還像新娘败潦。我一直安慰自己,他們只是感情好准脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著檬洞,像睡著了一般狸膏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上添怔,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天湾戳,我揣著相機(jī)與錄音,去河邊找鬼广料。 笑死砾脑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艾杏。 我是一名探鬼主播韧衣,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了畅铭?” 一聲冷哼從身側(cè)響起氏淑,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硕噩,沒想到半個(gè)月后假残,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炉擅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年辉懒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谍失。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡眶俩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袱贮,到底是詐尸還是另有隱情仿便,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布攒巍,位于F島的核電站嗽仪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏柒莉。R本人自食惡果不足惜闻坚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兢孝。 院中可真熱鬧窿凤,春花似錦、人聲如沸跨蟹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窗轩。三九已至夯秃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痢艺,已是汗流浹背仓洼。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堤舒,地道東北人色建。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像舌缤,于是被迫代替她去往敵國和親箕戳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子某残,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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