1. 程式人生 > >併發程式設計:LinkedBlockingQueue原始碼淺析

併發程式設計: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後端技術棧