LinkedBlockingQueue 原始碼學習

2021-07-02 07:03:43 字數 2199 閱讀 6467

linkedblockingqueue是乙個由單向鍊錶實現的阻塞佇列,該佇列按照先進先出的原則對元素進行排序。隊尾插入元素,對頭刪除元素。在構造linkedblockingqueue時可以指定容量大小,若未指定元素,則容量大小為integer.max_value.

1.以下為linkedblockingqueue的屬性

static class node

}/** the capacity bound, or integer.max_value if none */

private final int capacity;

/** current number of elements */

private final atomicinteger count = new atomicinteger(0);//佇列中元素的個數

/*** head of linked list.

* invariant: head.item == null

*/private transient nodehead;//頭節點,

/*** tail of linked list.

* invariant: last.next == null

*/private transient nodelast;//尾節點

/** lock held by take, poll, etc */

private final reentrantlock takelock = new reentrantlock();//取出鎖

/** wait queue for waiting takes */

private final condition notempty = takelock.newcondition();//非空條件

/** lock held by put, offer, etc */

private final reentrantlock putlock = new reentrantlock();//插入鎖

/** wait queue for waiting puts */

private final condition notfull = putlock.newcondition();//非滿條件

linkedblockingqueue採用兩把鎖,takelock和putlock .對插入元素和取出元素採用不同的鎖,提高併發性。

以下主要分析put與take操作

2.put函式原始碼分析:

public void put(e e) throws interruptedexception 

enqueue(node);//插入元素node

c = count.getandincrement();//把在執行插入元素操作之前的佇列元素個數賦給c ,count再增一

if (c + 1 < capacity)//如果在插入元素之後,佇列元素的個數小於capacity,說明佇列還可以執行put操作,本put

//本put執行緒喚醒其他被阻塞的put執行緒

notfull.signal();

} finally

if (c == 0)//在插入此元素之前若c為零,說明可能會有take執行緒被阻塞,則喚醒被阻塞的take執行緒

signalnotempty();

}

private void signalnotempty()  finally 

}

3.take()原始碼分析

public e take() throws interruptedexception 

x = dequeue();

c = count.getanddecrement();//獲得執行刪除元素之前,佇列中元素的個數

if (c > 1)//若c>1說明佇列中還有元素 ,則喚醒被阻塞的take執行緒

notempty.signal();

} finally

if (c == capacity)//在刪除元素之前,佇列已滿,喚醒被阻塞的put執行緒

signalnotfull();

return x;

}

private void signalnotfull()  finally 

}

Redux createStore原始碼學習

redux apiexport原始碼結構上面我們看到了redux的api和原始碼結構,看的出來,warning.js和index.js不用解析,都看得懂,關鍵時其餘的幾個module,那我們從最重要的createstore講起。export var actiontypes 首先定義了乙個action...

pytorch geometric 原始碼學習

作者大神真的太屌了,膜拜,工程實現能力太強了 本文希望能夠記錄學習其原始碼的過程 data dataset 部分 涉及優化?property 一種python內建裝飾器,可以將乙個成員函式當成成員變數來訪問,例如 class planetoid inmemorydataset url def ini...

logback原始碼閱讀 根據原始碼學擴充套件點 七

原始碼 點選跳轉 1.xml定義 xml version 1.0 encoding utf 8 configuration property name charset value utf 8 name class encoder pattern p d t logger line n m n n p...