1 資料結構
reentrantlock是可重入鎖,又分為公平鎖和非公平鎖。類圖如下:
1.1 aqs原始碼解析
1.2 sync
* reentrantlock 基礎結構
abstract static class sync extends abstractqueuedsynchronizer else finally while (pred.waitstatus > 0);
pred.next = node;
//cas把前驅節點設定為signal狀態
else {
compareandsetwaitstatus(pred, ws, node.signal);
//返回false,重新進入自旋
return false;
(3) aqs parkandcheckinterrupt
* 呼叫locksupport進行等待(locksupport呼叫的是unsafe)
private final boolean parkandcheckinterrupt() {
locksupport.park(this);
return thread.interrupted();
2.6 時序圖
3 公平鎖加鎖
* 流程和非公平鎖差不多,當乙個新執行緒進來非公平鎖有搶資源操作,如果搶到資源那麼不用進入clh佇列,非公平鎖必須入clh佇列
* 所以非公平鎖比公平鎖快
final void lock() {
acquire(1);
4 解鎖
4.1 reentrantlock unlock
public void unlock() {
sync.release(1);
4.2 aqs release
* 釋放資源
public final boolean release(int arg) {
//嘗試釋放資源
if (tryrelease(arg)) {
//獲取頭指標
node h = head;
//如果頭指標不為空,狀態是非cancelled狀態,喚醒後續有效執行緒
if (h != null && h.waitstatus != 0)
unparksuccessor(h);
return true;
return false;
(1) aqs tryrelease
protected final boolean tryrelease(int releases) {
//計算當前同步狀態
int c = getstate() - releases;
//如果釋放資源執行緒不是擁有資源的執行緒則丟擲錯誤
if (thread.currentthread() != getexclusiveownerthread())
throw new illegalmonitorstateexception();
//空閒資源標記
boolean free = false;
//如果同步狀態為0,表示當前沒有執行緒擁有當前資源,空閒標記為true
if (c == 0) {
free = true;
setexclusiveownerthread(null);
//更新同步狀態
setstate(c);
return free;
(2) aqs unparksuccessor
*喚醒等待執行緒
private void unparksuccessor(node node) {
* 當前頭節點的狀態
int ws = node.waitstatus;
//如果頭節點的狀態不是初始化狀態,那麼cas設定頭節點的狀態為初始化狀態
if (ws < 0)
compareandsetwaitstatus(node, ws, 0);
* 獲取clh佇列第二個節點
node s = node.next;
//如果不存在第二個節點或者第二個節點為cancelled狀態
if (s == null || s.waitstatus > 0) {
//s指向null
s = null;
//從尾部找有效節點並且賦值給s
for (node t = tail; t != null && t != node; t = t.prev)
if (t.waitstatus <= 0)
s = t;
//如果s指向節點不為null,那麼喚醒s節點的執行緒
if (s != null)
locksupport.unpark(s.thread);
AbstractCollection原始碼分析
abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...
ThreadPoolExecutor原始碼閱讀
執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...
OrangePi One Android 原始碼編譯
一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...