ReentrantLock原始碼解析

2022-06-09 20:36:09 字數 2350 閱讀 2857

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