1. 程式人生 > >掌握併發包下的佇列

掌握併發包下的佇列

說到佇列尤其是阻塞佇列,不得不說jdk的併發包(Java.util.concurrent)中的相關資料結構,今天我們就來對java(JDK1.7)中的佇列做一個總結。

1、Queue

佇列介面,定義了佇列基本的介面方法

這裡寫圖片描述

前兩個方法是往佇列塞資料,在佇列空間不足的情況下add會丟擲異常,而offer會返回false。poll和peek的區別是後者不會從佇列中移除元素。

2、BlockingQueue、BlockingDequeue(阻塞佇列、雙向阻塞佇列)

這裡寫圖片描述

BlockingQueue擴充套件Queue的方法,使其在在佇列已滿的情況下新增元素時有了4種模式:其一,拋異常;其二,立即返回false;其三,等待;其四,等待一段時間。除此之外還增加了drainTo介面用於追加其它集合的元素到隊尾

3、ArrayBlockingQueue、LinkedBlockingQueue

這裡寫圖片描述

這裡寫圖片描述

兩者直接的最重要的區別就是前者使用了陣列來儲存元素,而後者使用Node(鏈式結構)來儲存元素,其它方法和它們的父類差不多。inc和dec方法是用來檢查邊界的。此外按照集合類的慣例提供了一個迭代器內部類同時LinkedBlockingQueue還提供了一個從物件流中讀寫物件的方法。

4、TransferQueue、LinkedTransferQueue

這裡寫圖片描述

這兩個類比類似的集合類多了個Transfer的功能,這個功能會通過tryTransfer方法和transfer方法直接投遞元素,而不會放入佇列,區別在於前者如果沒有對應等待的消費者會直接返回false後者會等待到消費者拿取元素。

5、PriorityBlockingQueue

這裡寫圖片描述

值得提醒的一點是如果要保證這個Queue是按優先順序來排列元素的,必須自己實現元素的CompareTo方法達到目的。

6、DelayedQueue

這個佇列沒太多可以介紹,它增加的功能就是能為元素設定一個失效時間,失效後才能被從佇列中取出來。

7、SychronousQueue

這裡寫圖片描述

這個佇列的用處就是它只能有一個元素,取一個塞一個。

8、ConcurrentLinkedQueue和ConcurrentLinkedDeque

這裡寫圖片描述

前面提到的queue都是非執行緒安全的queue,ConcurrentLinkedQueue是執行緒安全的類。那麼問題來了,它是怎麼實現執行緒安全的呢?首先它的head和tail節點都是使用關鍵字volatile保證了記憶體可見性,其次,阻塞佇列使用了鎖來實現阻塞功能,而併發阻塞佇列的入隊和出隊操作使用CAS操作實現無所程式設計來達到同樣目的,效率更高。