* 鍊錶
*/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...