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...