併發程式設計:LinkedBlockingQueue原始碼淺析
申明:本文是基於jdk1.8的原始碼
LinkedBlockingQueue類圖結構
LinkedBlockingQueue底層基於單向連結串列實現的阻塞佇列,可以當做無界佇列也可以當做有界佇列來使用。
為什麼可以當做無界佇列?
從第一個無參構造方法可知,在沒有指定容量大小的時候,預設容量為
Integer.MAX_VALUE=2的32次方-1=2147483647
這個確實也夠大了,所以很多人都把他當成無界。
從上面的構造方法中可以得出3點結論:
-
當呼叫無參的構造方法時,容量是int的最大值
-
佇列中至少包含一個節點,哪怕佇列對外表現為空
-
LinkedBlockingQueue不支援null元素
對於LinkedBlockingQueue需要掌握以下幾點
-
建立
-
入隊(新增元素)
-
出隊(刪除元素)
資料節點Node
LinkedBlockingQueue的組成:
一個連結串列+兩把鎖+兩個條件
入隊
LinkedBlockingQueue 提供了多種入隊操作的實現來滿足不同情況下的需求,入隊操作有如下幾種:
add()方法時父類裡實現的,本類裡是沒有實現的,入隊成功返回true,入隊失敗丟擲 IllegalStateException 異常。
最終呼叫的是offer方法。
offer()方法
在隊尾插入一個元素,
-
容量沒滿,可以立即插入,返回true;
-
佇列滿了,直接返回false
注:如果使用了限制了容量的佇列,這個方法比add()好,因為add()插入失敗就會丟擲異常
enqueue()方法
offer()方另外的一種方法就是設定等待時間
put()
1:沒有返回值
2:當佇列為滿隊時,再想往佇列裡新增元素則需要阻塞等待
每次佇列元素新增完畢後,採用原子類AtomicInteger加一
出隊
LinkedBlockingQueue 也提供了多種出隊操作的實現來滿足不同情況下的需求,如下:
poll()方法
如果佇列不為空,則出隊並返回隊頭元素,否則返回null。
poll()超時方法
在指定的時間內一直嘗試出隊,出隊成功返回隊頭元素,否則返回null。
dequeue()方法
take()方法
當佇列為空佇列時候,阻塞等待佇列有元素
remove()方法
contains()方法
clear()方法
更多原始碼閱讀請關注微信公號 Java後端技術棧