隊(duì)列

0x00 基本概念

和棧一樣览祖,隊(duì)列也是一種受操作限制的線性表孝鹊,和棧相反的是隊(duì)列是先進(jìn)先出,最基本的操作也是兩個(gè)展蒂,入隊(duì)和出隊(duì)又活。

隊(duì)列應(yīng)用非常廣泛,特別是一些具有額外特性的隊(duì)列锰悼,比如:循環(huán)隊(duì)列柳骄、阻塞隊(duì)列、并發(fā)隊(duì)列等箕般。
高性能隊(duì)列Disruptor耐薯、linux環(huán)形緩存都用到了循環(huán)并發(fā)隊(duì)列,java concurrent并發(fā)包利用ArrayBlockingQueue來(lái)實(shí)現(xiàn)公平鎖

0x01 順序隊(duì)列&鏈?zhǔn)疥?duì)列&循環(huán)隊(duì)列

和棧一樣丝里,隊(duì)列也可以使用數(shù)組或鏈表來(lái)實(shí)現(xiàn)可柿,數(shù)組實(shí)現(xiàn)的隊(duì)列叫順序隊(duì)列,鏈表實(shí)現(xiàn)的叫鏈?zhǔn)疥?duì)列

  • 順序隊(duì)列

由于數(shù)組長(zhǎng)度不能修改丙者,所以順序隊(duì)列大小也要提前給出,隊(duì)列需要維護(hù)兩個(gè)指針营密,分別指向隊(duì)首和隊(duì)尾械媒,當(dāng)隊(duì)尾到達(dá)數(shù)組最后時(shí),隊(duì)首由于出隊(duì)操作可能不在數(shù)組頭部,這時(shí)數(shù)組前面有部分空間是沒(méi)有使用的纷捞,這時(shí)需要把所有數(shù)據(jù)前移痢虹,這一步可以放在每次入隊(duì)的時(shí)候判斷,集中搬遷

隊(duì)空判斷:head==tail
隊(duì)滿判斷:tail==n && head==0

GitHub

  • 鏈?zhǔn)疥?duì)列

鏈?zhǔn)疥?duì)列使用鏈表實(shí)現(xiàn)主儡,也是兩個(gè)指針head奖唯、tail分別指向隊(duì)首和隊(duì)尾,出隊(duì)時(shí)返回head指向的元素糜值,然后將head指向head的next丰捷,入隊(duì)時(shí),將元素插入tail的next寂汇,然后將tail指向next病往,注意隊(duì)列為空時(shí)的判斷,還有當(dāng)只剩最后一個(gè)元素時(shí)骄瓣,出隊(duì)停巷,此時(shí)head指向null,要注意修改tail的指向

隊(duì)空判斷:head==null
隊(duì)滿判斷:不用判斷榕栏,注意一下tail==null的情況就行了

GitHub

  • 循環(huán)隊(duì)列

循環(huán)隊(duì)列看起來(lái)像一個(gè)環(huán)畔勤,沒(méi)有首尾,和數(shù)組比扒磁,沒(méi)有了首尾庆揪,這樣我們可以避免數(shù)據(jù)的搬遷工作,循環(huán)隊(duì)列的實(shí)現(xiàn)渗磅,最關(guān)鍵的是隊(duì)空和隊(duì)滿時(shí)的判斷嚷硫,以數(shù)組實(shí)現(xiàn)為例:假設(shè)數(shù)組長(zhǎng)度n、隊(duì)首指針head(指向?qū)⒁鲫?duì)的位置)始鱼、隊(duì)尾指針tail(指向?qū)⒁腙?duì)的位置)

順序隊(duì)列中仔掸,tail也是指向?qū)⒁腙?duì)的位置,當(dāng)隊(duì)列滿時(shí)tail索引為n医清,且head索引為0起暮,當(dāng)隊(duì)列空時(shí)head和tail索引相等。

在循環(huán)隊(duì)列中会烙,為空時(shí)负懦,head和tail相等,隊(duì)列滿時(shí)柏腻,tail的下一個(gè)是head纸厉,為了與隊(duì)空時(shí)區(qū)分,這里會(huì)浪費(fèi)一個(gè)位置五嫂。所以當(dāng)tail下一個(gè)位置為head時(shí)颗品,就不在入隊(duì)肯尺,

隊(duì)空判斷:隊(duì)首指針和隊(duì)尾指針相等 head==tail
隊(duì)滿判斷:tail的下一個(gè)位置是head,數(shù)組索引時(shí)0~n-1躯枢,所以tail+1==head则吟,還有一種特殊情況,tail=n-1,head=0锄蹂,所以結(jié)合起來(lái)得到 (tail+1)%n == head

GitHub

0x02 課后思考

1氓仲、除了線程池這種池結(jié)構(gòu)會(huì)用到隊(duì)列排隊(duì)請(qǐng)求,你還知道有哪些類似的池結(jié)構(gòu)或者場(chǎng)景中會(huì)用到隊(duì)列的排隊(duì)請(qǐng)求呢得糜?

實(shí)際上敬扛,對(duì)于大部分資源有限的場(chǎng)景,當(dāng)沒(méi)有空閑資源時(shí)掀亩,基本上都可以通過(guò)隊(duì)列這種數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)舔哪,還有分布式消息隊(duì)列,例如kafka也是一種隊(duì)列

2槽棍、今天講到并發(fā)隊(duì)列捉蚤,關(guān)于如何實(shí)現(xiàn)無(wú)鎖并發(fā)隊(duì)列,網(wǎng)上有非常多的討論炼七。對(duì)這個(gè)問(wèn)題缆巧,你怎么看呢?

無(wú)鎖隊(duì)列可以使用cas(Compare and Swap)原子操作來(lái)實(shí)現(xiàn)豌拙,入隊(duì)前獲取tail位置陕悬,入隊(duì)時(shí)比較tail是否變化,如果沒(méi)變按傅,則允許入隊(duì)捉超,反之入隊(duì)失敗,出隊(duì)則是獲取head位置唯绍,進(jìn)行cas

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拼岳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子况芒,更是在濱河造成了極大的恐慌惜纸,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绝骚,死亡現(xiàn)場(chǎng)離奇詭異耐版,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)压汪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門粪牲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人止剖,你說(shuō)我怎么就攤上這事腺阳∈遥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵舌狗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扔水,道長(zhǎng)痛侍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任魔市,我火速辦了婚禮主届,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘待德。我一直安慰自己君丁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布将宪。 她就那樣靜靜地躺著绘闷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪较坛。 梳的紋絲不亂的頭發(fā)上印蔗,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音丑勤,去河邊找鬼华嘹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛法竞,可吹牛的內(nèi)容都是我干的耙厚。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼岔霸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薛躬!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起秉剑,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祸轮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后诬乞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體埋哟,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年略水,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了价卤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渊涝,死狀恐怖慎璧,靈堂內(nèi)的尸體忽然破棺而出床嫌,到底是詐尸還是另有隱情,我是刑警寧澤胸私,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布厌处,位于F島的核電站,受9級(jí)特大地震影響岁疼,放射性物質(zhì)發(fā)生泄漏阔涉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一捷绒、第九天 我趴在偏房一處隱蔽的房頂上張望瑰排。 院中可真熱鬧,春花似錦暖侨、人聲如沸椭住。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)京郑。三九已至,卻和暖如春扳肛,著一層夾襖步出監(jiān)牢的瞬間傻挂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工挖息, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留金拒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓套腹,卻偏偏與公主長(zhǎng)得像绪抛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子电禀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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