LinkedBlockingQueue原始碼深入解析

2021-10-05 19:16:52 字數 1915 閱讀 8196

* 鍊錶

*/static

class

node

}/** 未指定的話,容量為integer最大值 */

private

final

int capacity;

/** 當前元素數量 */

private

final atomicinteger count =

newatomicinteger()

;/**

* 頭節點

*/transient node

head;

/** * 尾結點

*/private

transient node

last;

/** take, poll 持有的鎖*/

private

final reentrantlock takelock =

newreentrantlock()

;/** wait queue for waiting takes */

private

final condition notempty = takelock.

newcondition()

;/** put, offer 持有的鎖 */

private

final reentrantlock putlock =

newreentrantlock()

;/** wait queue for waiting puts */

private

final condition notfull = putlock.

newcondition()

;鎖分為take鎖和put鎖,是為了兩個操作可以同時進行,互不影響

初始化操作

put 方法

// 新增元素e到佇列尾部

// 新增元素,空間滿等待,空間不滿直接成功

public

void

put(e e)

throws interruptedexception

//佇列沒有滿,直接新增

enqueue

(node)

;//獲取新增之前的值

c = count.

getandincrement()

;//還有容量,通知其他執行緒

if(c +

1< capacity)

notfull.

signal()

;}finally

//佇列中里有乙個元素,喚醒乙個take等待執行緒

if(c ==0)

signalnotempty()

;}//入隊,把元素直接放在隊尾

private

void

enqueue

(node

node)

take方法
public e take()

throws interruptedexception

//非空佇列,阻塞,從頭部拿乙個資料

x =dequeue()

;//c

c = count.

getanddecrement()

;if(c >1)

notempty.

signal()

;}finally

if(c == capacity)

signalnotfull()

;return x;

}private e dequeue()

這個工具類可以用到各種阻塞場景

azkaban web server原始碼解析

azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...

JDK LinkedHashMap原始碼解析

今天來分析一下jdk linkedhashmap的源 public class linkedhashmapextends hashmapimplements map可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大...

Redux原始碼createStore解讀常用方法

const store createstore reducer,preloadedstate enhancer 直接返回當前currentstate,獲取state值,return state 我覺得應該深轉殖乙個新的物件返回,不然有可能會被外部修改 function getstate consol...