基於雙向鍊錶的簡單阻塞佇列

2022-06-12 15:45:11 字數 1776 閱讀 7259

最近工作比較忙,水一篇:

/**

* @author niuxy

* @date 2020/6/8 8:54 下午

* @description 基於雙向鍊錶的簡單 fifo 佇列

* 鎖的粒度很粗,僅針對最上層操作進行互斥同步關係規劃

* 最上層方法有兩個:put 與 remove

* 以 length 與 capacity 是否相等為競態條件進行同步

* put 與 remove 操作涉及了相同的共享變數,動作互斥

* 只要在某個時刻,兩個動作的競態條件必然有乙個會得到滿足,便至少有乙個執行緒處於執行狀態

* 鎖的設計越少越安全,但粒度太粗的互斥關係也會降低執行效率。如果鎖較多,需要注意鎖依賴(獲取順序)的一致性,防止死鎖 */

public

class synchronizedqueue

public

t getvalue()

public

void

setvalue(t value)

public

node getnext()

public

void

setnext(node next)

public

node getpre()

public

void

setpre(node pre)

}//佇列容量

private

intcapacity;

//佇列當前長度

private

intlength;

//虛擬頭結點

private

node firstnode;

//虛擬尾結點

private

node lastnode;

synchronizedqueue(

intcapacity)

//移除並返回隊尾節點

public

synchronized t remove() throws

interruptedexception

node node =lastnode.pre;

while (length <= 0)

node.pre.next =lastnode;

lastnode.pre =node.pre;

length--;

notifyall();

return

node.value;

}//新增節點,放入隊首

public

synchronized

void put(t value) throws

interruptedexception

node node = new

node(value);

node.next =firstnode.next;

node.pre =firstnode;

firstnode.next =node;

node.next.pre =node;

length++;

print();

notifyall();

}private

synchronized

void

print()

system.out.println("---------");}}

基於雙向鍊錶實現無鎖佇列

由於鍊錶的特性,因此可以知道其進行新增元素或者刪除元素只需要進行節點的改變即可,同時不需要考慮擴容和縮容的問題,比較方便。那實現佇列,需要的是生產者和消費者的模型。其本質是執行進隊和出隊操作。下面的 源於 那麼怎樣才能實現乙個併發無鎖的佇列呢?首先需要考慮佇列是基於鍊錶的,因此我們能操作它的前驅節點...

雙向佇列的鍊錶實現

定義以下這樣乙個佇列結構 include include define elementtype int define error 1e5 typedef struct node ptrtonode struct node typedef struct dequerecord deque struct...

雙向鍊錶的簡單實現

雙向鍊錶的特點是 第乙個元素的 prev 是none 1 雙向鍊錶 2class node 3def init self,node none,prev none,next none 4 注意順序,因為例項化,一般不會關鍵字傳參,如果node none 1 1 是給node形參的,如果形參列表不同,則...