//先看建構函式
//初始化乙個給定容量的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...