并發(fā)集合6-ArrayBlockingQueue源碼分析

1- 前言

ArrayBlockingQueue是基于循環(huán)數(shù)組實現(xiàn)的有界阻塞隊列氮昧。不允許元素為null考润,構(gòu)造器內(nèi)必須指定隊列的容量燥透。

2- 定義


繼承結(jié)構(gòu)和LinkedBlockingQueue一樣卡睦,在實際使用時可以互換使用肮疗。

3- 重要字段

  1. item:為儲存元素的循環(huán)數(shù)組爬泥。
  2. takeIndex:下一次take相關(guān)操作的item數(shù)組下標(biāo)柬讨。
  3. putIndex:下一次put相關(guān)操作的item數(shù)組下標(biāo)。
  4. count:隊列元素計數(shù)袍啡。

一個ReentrantLock重入鎖踩官,兩個Condition對象。

4- 構(gòu)造器

指定初始容量(必須大于0)境输,以及鎖的公平性

調(diào)用上面構(gòu)造器蔗牡,指定初始容量,默認(rèn)設(shè)置非公平鎖



集合構(gòu)造器嗅剖,用ReentrantLock提供鎖的語義辩越,實現(xiàn)線程可見性,而不是保證線程安全信粮,因為items黔攒、count、putIndex、takeIndex都是普通變量督惰。

無論使用哪個構(gòu)造器不傅,都要指定初始大于0的容量,然后立即創(chuàng)建指定容量的Object數(shù)組赏胚,創(chuàng)建之后蛤签,就再也不能更改了,使用的循環(huán)數(shù)組來實現(xiàn)在不移動數(shù)組元素的情況下刪除添加元素到數(shù)組當(dāng)中栅哀。

5- offer方法(不響應(yīng)中斷)



加鎖入隊,保證線程安全称龙,簡單判斷一下是否隊列已滿留拾,如果已滿則直接返回false,并不等待鲫尊,然后將元素加入putIndex位置上痴柔,如果putIndex到達(dá)數(shù)組末尾則直接循環(huán)到數(shù)組頭部,因為容量不變疫向,所以不用擔(dān)心容量擴容時帶來復(fù)雜的操作咳蔚。

6- put方法(響應(yīng)中斷)


響應(yīng)中斷,并且在在隊列滿時搔驼,需要等待直到被通知notFull谈火。

7- offer(中斷超時)

8- poll(不響應(yīng)中斷)


9- take(響應(yīng)中斷)

10- poll(中斷超時)

11- peek

12- size

返回當(dāng)前隊列含有的元素數(shù)量,強一致性舌涨,時間復(fù)雜度為O(1)


13- remove



刪除第一個在隊列中出現(xiàn)的和指定對象相等的元素糯耍,時間復(fù)雜度為O(n)

14- contains

遍歷數(shù)組,時間復(fù)雜度為O(n)

15- iterator

此類 iterator() 方法每次返回的 Iterator 是一個“弱一致”的迭代器囊嘉,從不拋出 ConcurrentModificationException温技,并且確保可遍歷迭代器構(gòu)造時存在的元素扭粱,此外還可能(但并不保證)反映構(gòu)造后的所有修改舵鳞。

16- 方法列表


總結(jié)

  1. 特性基本和LinkedBlockingQueue基本一致,但是基于數(shù)組的阻塞隊列吞吐量要小于基于鏈表的阻塞隊列琢蛤。

  2. 和ArrayDeque同樣是基于循環(huán)數(shù)組實現(xiàn)的蜓堕,在ArrayDeque中是通過與數(shù)組長度length-1進(jìn)行與運算來定位元素位置的,這是因為ArrayDeque是動態(tài)擴容的虐块,而在ArrayBlockingQueue中數(shù)組是固定容量的俩滥,創(chuàng)建后不可更改,當(dāng)元素下標(biāo)超過數(shù)組長度則直接放在索引為0的位置上贺奠,這是因為count計數(shù)能保證元素數(shù)量不會超出數(shù)組的長度霜旧,當(dāng)count等于數(shù)組長度時將阻塞put元素的線程直到非空,同樣對于take元素也是類似的。

參考鏈接
http://www.importnew.com/24055.html
http://ifeve.com/juc-arrayblockingqueue/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挂据,一起剝皮案震驚了整個濱河市以清,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌崎逃,老刑警劉巖掷倔,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異个绍,居然都是意外死亡勒葱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門巴柿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凛虽,“玉大人,你說我怎么就攤上這事广恢】” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵钉迷,是天一觀的道長至非。 經(jīng)常有香客問我,道長糠聪,這世上最難降的妖魔是什么荒椭? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮舰蟆,結(jié)果婚禮上戳杀,老公的妹妹穿的比我還像新娘。我一直安慰自己夭苗,他們只是感情好信卡,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著题造,像睡著了一般傍菇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上界赔,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天丢习,我揣著相機與錄音,去河邊找鬼淮悼。 笑死咐低,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袜腥。 我是一名探鬼主播见擦,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲤屡?” 一聲冷哼從身側(cè)響起损痰,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酒来,沒想到半個月后卢未,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡堰汉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年辽社,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘鸭。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡爹袁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矮固,到底是詐尸還是另有隱情,我是刑警寧澤譬淳,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布档址,位于F島的核電站,受9級特大地震影響邻梆,放射性物質(zhì)發(fā)生泄漏守伸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一浦妄、第九天 我趴在偏房一處隱蔽的房頂上張望尼摹。 院中可真熱鬧,春花似錦剂娄、人聲如沸蠢涝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽和二。三九已至,卻和暖如春耳胎,著一層夾襖步出監(jiān)牢的瞬間惯吕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工怕午, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留废登,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓郁惜,卻偏偏與公主長得像堡距,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

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