ArrayBlockingQueue原始碼解讀

2021-09-02 20:54:22 字數 2893 閱讀 5254

//先看建構函式

//初始化乙個給定容量的arrayblockingqueue

public arrayblockingqueue(int capacity)

//通過給定的容量初始化內部的陣列和鎖以及條件。

public arrayblockingqueue(int capacity, boolean fair)

//通過給定的集合初始化陣列超出大小會丟擲異常這裡為什麼要上鎖?原始碼注釋寫的是這裡不會有互斥,只是為了保證可見性。防止指令重排?

public arrayblockingqueue(int capacity, boolean fair,

collection<? extends e> c)

} catch (arrayindexoutofbound***ception ex)

//將數量設定為i

count = i;

//設定putindex的位置如果陣列已滿的話設定為0

putindex = (i == capacity) ? 0 : i;

} finally

}//add方法 呼叫offer方法新增元素如果成功返回true失敗丟擲異常

public boolean add(e e)

public boolean add(e e)

public boolean offer(e e)

} finally

}private void insert(e x)

final int inc(int i)

//poll方法沒有元素獲取null

public e poll() finally

}private e extract()

@suppresswarnings("unchecked")

static e cast(object item)

//poll(long timeout, timeunit unit)在該時間內一直嘗試去獲取元素超時返回null。

/**這個方法實現的很精妙,直接在notempty條件上掛起當前執行緒,如果該條件被喚醒,

他就去獲取一次值。

*/public e poll(long timeout, timeunit unit) throws interruptedexception

return extract();

} finally

}//offer(e e, long timeout, timeunit unit)在指定時間內插入元素超時返回false

public boolean offer(e e, long timeout, timeunit unit)

throws interruptedexception

insert(e);

return true;

} finally

}//remove方法成功返回true失敗返回false

public boolean remove(object o)

}return false;

} finally

}//如果刪除的是頭元素直接刪除takeindex+1,否則滑動整個陣列,重新構建整個陣列。

void removeat(int i) else else }}

--count;

//當前佇列已經非滿喚醒在非滿條件上等待的執行緒

notfull.signal();

}//peek:獲取頭元素如果沒有獲取到則返回null。僅僅是獲取不移除。

public e peek() finally

}final e itemat(int i)

//put()如果佇列已滿。則阻塞。直到notfull條件被喚醒。

public void put(e e) throws interruptedexception finally

}//take()如果隊列為空則阻塞.直到notempty條件被喚醒。

public e take() throws interruptedexception finally

}//remainingcapacity()返回當前還能夠容下的元素個數

public int remainingcapacity() finally

}//contains返回是否包含當前元素

public boolean contains(object o) finally

}//返回乙個包含當前元素的新陣列object型別

public object toarray() finally

}//返回指定型別的新陣列

public t toarray(t a) finally

}//移除此佇列中的所有元素

public void clear() finally

}//返回迭代器乙個內部類實現這裡就不寫了

public iteratoriterator()

//移除佇列中的所有元素並封裝到collection中

public int drainto(collection<? super e> c)

if (n > 0)

return n;

} finally

}//從此佇列中最多移出maxelements個元素。

public int drainto(collection<? super e> c, int maxelements)

if (n > 0)

return n;

} finally

}/**

總結:arrayblockingqueue低層是用陣列+鎖實現。是一種可以用於生產者消費者模式的可阻塞的佇列。但是插入和刪除這些操作都是用的一把鎖。這可能會導致效率不高?

*/

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