Java 集合深入理解(10):Deque 雙端隊列


點擊查看 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 並發編程實戰》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM