點選檢視 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~


什麼是 Deque

DequeDouble ended queue (雙端佇列) 的縮寫,讀音和 deck 一樣,蛋殼。

Deque 繼承自 Queue,直接實現了它的有 LinkedList, ArayDeque, ConcurrentLinkedDeque 等。

Deque 支援容量受限的雙端佇列,也支援大小不固定的。一般雙端佇列大小不確定。

Deque 介面定義了一些從頭部和尾部訪問元素的方法。比如分別在頭部、尾部進行插入、刪除、獲取元素。和 Queue

類似,每個操作都有兩種方法,一種在異常情況下直接丟擲異常奔潰,另一種則不會拋異常,而是返回特殊的值,比如 false, null …

插入(Insert)方法的第二種是針對固定大小的雙端佇列設計的。大多數情況下 插入都不會失敗。

Deque 繼承了 Queue 介面的方法。當 Deque 當做 佇列使用時(FIFO),新增元素是新增到隊尾,刪除時刪除的是頭部元素。從 Queue 介面繼承的方法對應容器的方法如圖所示:

Deque 也能當棧用(後進先出)。這時入棧、出棧元素都是在 雙端佇列的頭部 進行。Deque 中和棧對應的方法如圖所示:

Deque 包含的方法如下圖所示:

根據名字就能看到功能,具體實現我們下篇看 LinkedList 原始碼時介紹。

Deque 的實現類

Deque 的實現類主要分為兩種場景:

  • 一般場景

    • LinkedList 大小可變的連結串列雙端佇列,允許元素為 null
    • ArrayDeque 大下可變的陣列雙端佇列,不允許 null
  • 併發場景
    • LinkedBlockingDeque 如果佇列為空時,獲取操作將會阻塞,知道有元素新增

Deque 與 工作密取

在併發程式設計 中,雙端佇列 Deque 還用於 “工作密取” 模式。

什麼是工作密取呢?

在 生產者-消費者 模式中,所有消費者都從一個工作佇列中取元素,一般使用阻塞佇列實現;

而在 工作密取 模式中,每個消費者有其單獨的工作佇列,如果它完成了自己雙端佇列中的全部工作,那麼它就可以從其他消費者的雙端佇列末尾祕密地獲取工作。

工作密取 模式 對比傳統的 生產者-消費者 模式,更為靈活,因為多個執行緒不會因為在同一個工作佇列中搶佔內容發生競爭。在大多數時候,它們只是訪問自己的雙端佇列。即使需要訪問另一個佇列時,也是從 佇列的尾部獲取工作,降低了佇列上的競爭程度。

Thanks

https://docs.oracle.com/javase/tutorial/collections/interfaces/deque.html

https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html

http://www.nowamagic.net/librarys/veda/detail/2296

《Java 併發程式設計實戰》