JUC原始碼分析21 佇列

2021-12-29 22:36:32 字數 1500 閱讀 3511

linkedblockingdeque基於雙向鍊錶實現的阻塞佇列,根據構造傳入的容量大小決定有界還是無界,預設不傳的話,大小integer.max。

實現blockingdequeue介面,這個介面繼承blockingqueue和dequeue,看下介面方法:

public inte***ce blockingdeque extends blockingqueue, deque

因為是雙向結構,所以基本的操作成對的***first,***last。/** 雙向鍊錶節點 */

static final class node

}/**

* 首節點

*/transient node first;

/** * 尾節點

*/transient node last;

/** 佇列元素個數 */

private transient int count;

/** 佇列容量 */

private final int capacity;

/** main lock guarding all access */

final reentrantlock lock = new reentrantlock();

/** 獲取的條件等待:非空條件 */

private final condition notempty = lock.newcondition();

/** 插入元素的條件等待:非滿條件 */

private final condition notfull = lock.newcondition();

/** * 空構造,預設容量最大

*/public linkedblockingdeque()

/** * 指定容量

*/public linkedblockingdeque(int capacity) 構造的時候可以傳入鍊錶容量大小,沒傳入就integer.max。

看下最基礎的幾個方法:

// 4個基礎方法,dequeue的操作基本都是呼叫這些

/** * 設定node為煉表頭節點,鍊錶滿時為false

*/private boolean linkfirst(node node)

/** * 設定node為鍊錶尾節點,鍊錶滿時為false

*/private boolean linklast(node node)

/** * 移除頭結點,鍊錶空返回null

*/private e unlinkfirst()

/** * 移除尾結點,鍊錶空返回null

*/private e unlinklast()

/** * 移除指定節點:p--》x--》n

*/void unlink(node x) else if (n == null) else

}大部分的deque的實現都是呼叫這幾個方法。因為是雙端佇列,所以link\unlink都有針對first和last的操作。看明白這幾個方法,其他方法應該都沒問題了。

JUC原始碼分析 ThreadPool jdk6

public void execute runnable command finally finally catch interruptedexception ie catch runtimeexception ex finally finally catch securityexception s...

佇列Queue原始碼分析

定義 佇列是 只允許在一端進行插入操作,而在另一端進行刪除操作的線性表 缺點 出棧複雜度高,容易造成假溢位 可能對頭有很多空位置,此時插入放到了隊尾,就可能造成溢位,此時叫做假溢位 解決辦法 迴圈佇列 把頭尾相接的循序儲存結構稱為迴圈佇列 可以解決假溢位 佇列的鏈式儲存及結構模式 佇列的鏈式儲存及結...

資料結構 python 21 佇列

佇列 queue 是乙個資料集合,僅允許在列表的一端進行插入,另一端進行刪除。進行插入的一端稱為隊尾 rear 插入動作稱為進隊或入隊 進行刪除的一端稱為隊頭 front 刪除動作稱為出隊 佇列的性質 先進先出 first in,first out 為了讓佇列可以迴圈使用,這裡我們提出了環形佇列 環...