點選檢視 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 併發程式設計實戰》