Java中常用七個(gè)阻塞隊(duì)列的總結(jié)

Java隊(duì)列總結(jié)

通過(guò)前面文章的學(xué)習(xí)宜肉,我們對(duì)Java中常用隊(duì)列做了介紹。本文翎碑,咱們來(lái)對(duì)隊(duì)列做個(gè)總結(jié)吧谬返。

首先,我們介紹了現(xiàn)實(shí)生活中的實(shí)際場(chǎng)景(排隊(duì)買票等)日杈,來(lái)告訴我們?yōu)槭裁葱枰褂藐?duì)列遣铝。

隊(duì)列是一種先進(jìn)先出(FIFO)的抽象數(shù)據(jù)結(jié)構(gòu)佑刷,在Java中,隊(duì)列使用了兩種數(shù)據(jù)類型來(lái)實(shí)現(xiàn)的酿炸,分別是:數(shù)組和鏈表這兩種數(shù)據(jù)結(jié)構(gòu)项乒。

本文主要內(nèi)容:回顧Java中常用的七個(gè)阻塞隊(duì)列進(jìn)行總結(jié)及阻塞隊(duì)列中四組AP并進(jìn)行總結(jié)。

本文來(lái)源:本文是由凱哥Java(kaigejava)原創(chuàng)發(fā)布梁沧。

接著檀何,我們介紹了隊(duì)列的分類,可以分為兩類廷支,即阻塞隊(duì)列和非阻塞隊(duì)列频鉴。

常用的三個(gè)非阻塞隊(duì)列:LinkedList、PriorityQueue和ConcurrentLinkedQueue.

(PS:凱哥沒(méi)有做介紹恋拍,在以后的文章中垛孔,凱哥將對(duì)ConcurrentLinkedQueue進(jìn)行介紹)

然后我們介紹Java中常用的七個(gè)阻塞隊(duì)列。他們之間類圖關(guān)系:

我們可以看到施敢,隊(duì)列是Collection的子類周荐。也即和arrayList類似的。

接著我們就對(duì)七個(gè)阻塞隊(duì)列做了詳細(xì)的介紹僵娃。

阻塞隊(duì)列的七個(gè)子類

ArrayBlockingQueue(下文簡(jiǎn)稱:ABQueue)概作、LinkedBlockingQueue(下文簡(jiǎn)稱:LBQueue)、PriorityBlockingQueue(下文簡(jiǎn)稱:PBQueue)默怨、DelayQueue(下文簡(jiǎn)稱:DQueue)讯榕、SynchronouseQueue(下文簡(jiǎn)稱:SyncQueue)、LinkedTrnsferQueue(下文簡(jiǎn)稱:LTQueue)匙睹、LinkedBlockingDeque(下文簡(jiǎn)稱:LBDeque)這個(gè)七個(gè)愚屁。

來(lái)分別說(shuō)說(shuō)每個(gè)隊(duì)列的特點(diǎn):

ABQueue:

底層使用的是數(shù)組結(jié)構(gòu)。因?yàn)閿?shù)組需要初始化大小痕檬,所以其構(gòu)造器需要輸入隊(duì)列的大小霎槐。

是有界的阻塞安全隊(duì)列(思考:為什么說(shuō)是有界的?是怎么保證線程安全的梦谜?)丘跌,默認(rèn)是不保證線程的公平性(思考:為什么默認(rèn)不能保證線程公平?如何保證線程安全改淑?)碍岔,不允許向隊(duì)列中插入null元素。

LBQueue:

“有界”的阻塞安全隊(duì)列朵夏,其底層使用的是鏈表的數(shù)據(jù)結(jié)構(gòu)蔼啦。所謂的“有界”是因?yàn)椋J(rèn)隊(duì)列的大小是Integer.MAX_VALUE仰猖。這個(gè)數(shù)值等于21億+捏肢。因?yàn)檫@個(gè)數(shù)據(jù)太大了奈籽,也可以理解為無(wú)界的。不建議使用默認(rèn)值鸵赫,最好在初始化的時(shí)候衣屏,指定隊(duì)列的大小。

PBQueue:

是一個(gè)支持優(yōu)先級(jí)的無(wú)界隊(duì)列辩棒。支持優(yōu)先級(jí)是因?yàn)槭褂昧薱omparator這個(gè)接口狼忱。默認(rèn)采用字典升序排序策略的。如果不想使用默認(rèn)的一睁,在初始化的時(shí)候钻弄,還可以自定義比較器的。

以上三個(gè)隊(duì)列相關(guān)更詳細(xì)的介紹者吁,歡迎回看《Java中常用的七個(gè)阻塞隊(duì)列介紹第一篇》窘俺。在這篇文章中,凱哥對(duì)這三個(gè)隊(duì)列做了詳細(xì)的介紹以及代碼演示复凳。

DQueue:

是一個(gè)支持優(yōu)先級(jí)的無(wú)界阻塞隊(duì)列瘤泪。支持優(yōu)先級(jí)是應(yīng)該底層使用的是PriorityQueue隊(duì)列來(lái)實(shí)現(xiàn)的。而PriorityQueue隊(duì)列在添加元素的時(shí)候使用了siftUpComparable方法育八。這個(gè)對(duì)了的一個(gè)特點(diǎn):支持延時(shí)獲取对途。所以,這個(gè)隊(duì)列可以運(yùn)用在緩存系統(tǒng)的設(shè)計(jì)中单鹿。當(dāng)從隊(duì)列中獲取到數(shù)據(jù)掀宋,說(shuō)明延時(shí)時(shí)間到了深纲。

關(guān)于DQueue更多詳細(xì)的介紹仲锄,歡迎回看:《Java中常用的七個(gè)阻塞隊(duì)列第二篇DelayQueue源碼介紹》。在這篇文章中湃鹊,凱哥做了詳細(xì)的介紹儒喊,同時(shí)使用代碼模擬了緩存數(shù)據(jù)到期操作。

SyncQueue:

是一個(gè)無(wú)存儲(chǔ)空間的阻塞同步隊(duì)列币呵。不存儲(chǔ)元素的原因是因?yàn)榛忱ⅲ粋€(gè)put操作必須等待一個(gè)take操作與之對(duì)應(yīng)才可以。否則就不能繼續(xù)添加元素了余赢。默認(rèn)使用非公平的芯义。在性能上SyncQueue隊(duì)列的吞吐量比LBqueu和ABQueue的性能高。

LTQueue:是由鏈表組成的無(wú)界隊(duì)列妻柒。比其他隊(duì)列多了兩個(gè)方法:tryTransfer扛拨、transfer

LBDeque:鏈表組成的雙端隊(duì)列。這個(gè)隊(duì)列在以后凱哥講For/Join框架的時(shí)候举塔,還會(huì)說(shuō)到绑警。

七個(gè)阻塞隊(duì)列的小總結(jié):

接著求泰,我們講解了隊(duì)列中常用的四組API。

阻塞隊(duì)列四組API

會(huì)拋異常的:添加元素使用add(e),刪除元素使用remove计盒,檢查隊(duì)首元素使用的element.

當(dāng)隊(duì)列滿的時(shí)候渴频,在向隊(duì)列中添加元素會(huì)拋出異常;當(dāng)隊(duì)列為空的時(shí)候在從隊(duì)列中刪除或者是獲取隊(duì)首元素都會(huì)拋出異常北启;

帶有返回值的:添加元素:offer(e),刪除元素:poll()卜朗,檢查隊(duì)首元素:peek().

當(dāng)隊(duì)列滿的時(shí)候,再調(diào)用offer(e)向隊(duì)列中添加元素會(huì)返回false而不是拋出異常

當(dāng)隊(duì)列為空的時(shí)候咕村,調(diào)用take()或者是peek()方法返回null而不是拋出異常

阻塞一直等待的:添加元素:put(e),刪除元素:take()

當(dāng)隊(duì)列滿的時(shí)候聊替,再向隊(duì)列中添加元素,隊(duì)列會(huì)進(jìn)入阻塞狀態(tài)培廓,直到元素添加成功為止惹悄。

當(dāng)隊(duì)列為空的時(shí)候,再?gòu)年?duì)列刪除元素肩钠,隊(duì)列會(huì)阻塞泣港,直到能夠刪除元素為止。

帶有超時(shí)時(shí)間的阻塞:添加元素:offer(e,time,unit),刪除元素:poll(time,unit)

當(dāng)隊(duì)列滿的時(shí)候价匠,調(diào)用offer(e,time,unit)會(huì)進(jìn)入阻塞等待中当纱,當(dāng)過(guò)來(lái)超時(shí)時(shí)間,退出等待

當(dāng)隊(duì)列為空的時(shí)候踩窖,調(diào)用poll(time,unit)方法會(huì)進(jìn)入等待狀態(tài)坡氯,當(dāng)?shù)搅顺瑫r(shí)時(shí)間,會(huì)退出等待洋腮。

四組API總結(jié):

關(guān)于四組API更詳細(xì)的介紹歡迎學(xué)習(xí):《Java阻塞隊(duì)列的四組API》箫柳。在這篇文章中凱哥做了詳細(xì)的介紹。用人的一生四個(gè)階段來(lái)比擬這四組API啥供。

到此悯恍,我們已經(jīng)把Java中隊(duì)列介紹完畢。接下來(lái)伙狐,凱哥將帶著大家一起學(xué)習(xí)線程池涮毫。歡迎大家繼續(xù)學(xué)習(xí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贷屎,一起剝皮案震驚了整個(gè)濱河市罢防,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唉侄,老刑警劉巖咒吐,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡渤滞,警方通過(guò)查閱死者的電腦和手機(jī)贬墩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)妄呕,“玉大人陶舞,你說(shuō)我怎么就攤上這事⌒骼” “怎么了肿孵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)疏魏。 經(jīng)常有香客問(wèn)我停做,道長(zhǎng),這世上最難降的妖魔是什么大莫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任蛉腌,我火速辦了婚禮,結(jié)果婚禮上只厘,老公的妹妹穿的比我還像新娘烙丛。我一直安慰自己,他們只是感情好羔味,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布河咽。 她就那樣靜靜地躺著,像睡著了一般赋元。 火紅的嫁衣襯著肌膚如雪忘蟹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天搁凸,我揣著相機(jī)與錄音媚值,去河邊找鬼。 笑死坪仇,一個(gè)胖子當(dāng)著我的面吹牛杂腰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椅文,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼惜颇!你這毒婦竟也來(lái)了皆刺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凌摄,失蹤者是張志新(化名)和其女友劉穎羡蛾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體锨亏,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痴怨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年忙干,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浪藻。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捐迫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爱葵,到底是詐尸還是另有隱情施戴,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布萌丈,位于F島的核電站赞哗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏辆雾。R本人自食惡果不足惜肪笋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望度迂。 院中可真熱鬧涂乌,春花似錦、人聲如沸英岭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诅妹。三九已至罚勾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吭狡,已是汗流浹背尖殃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留划煮,地道東北人送丰。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弛秋,于是被迫代替她去往敵國(guó)和親器躏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344