點擊查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~
什么是 Deque

Deque 是 Double 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 並發編程實戰》
