ReentranLock原始碼分析

2021-10-24 09:49:40 字數 2486 閱讀 1892

與synchronized對比:

貼**例子:

private

final lock rtl =

newreentrantlock()

;public

void

test()

finally

}

reentranlock 的所有功能均由內部靜態類sync實現,fairsync 與 nonfairsync均繼承了該類。

整體以乙個int型別的state與乙個佇列實現,state代表了鎖的狀態,佇列則存放了等待獲取鎖的執行緒節點。

下面以nonfairsync為例分析

呼叫sync.lock

public

void

lock()

非公平鎖,sync 為 nonfairsync。

nonfairsync的**lock()**方法

final

void

lock()

若當前state為0,則代表當前鎖可獲得,若獲取成功,則將當前執行緒設為擁有鎖的執行緒。

(非公平鎖在lock時首先就會去嘗試獲取鎖,而公平鎖則會直接進入acquire方法,不會首先嘗試獲取鎖,這是兩者第乙個區別點)

protected

final

boolean

compareandsetstate

(int expect,

int update)

若state不為0,則進入acquire 方法

nonfairsync的acquire(1)

public

final

void

acquire

(int arg)

首先嘗試獲取鎖,若獲取失敗,則加入佇列中

protected

final

boolean

tryacquire

(int acquires)

獲取鎖通過檢查sync的state來判斷鎖狀態

final

boolean

nonfairtryacquire

(int acquires)

}// 如果當前執行緒擁有鎖,則state + 1,重入鎖的實現

else

if(current ==

getexclusiveownerthread()

)return

false

;}

nonfairsync的 acquirequeued

若獲取鎖失敗,則加入鎖獲取佇列,首先以當前執行緒建立node節點,addwaiter:

private node addwaiter

(node mode)

}// 若沒有佇列,或者隊尾插入失敗,則重複插入動作

enq(node)

;return node;

}private node enq

(final node node)

else}}

}

此時,已將當前執行緒節點加入到等待佇列,嘗試在佇列中獲取鎖,acquirequeued()

final

boolean

acquirequeued

(final node node,

int arg)

// 首先檢查節點的前置狀態,是否需要阻塞當前執行緒if(

shouldparkafte***iledacquire

(p, node)

&&// 阻塞當前執行緒

parkandcheckinterrupt()

) interrupted =

true;}

}finally

}

private

static

boolean

shouldparkafte***iledacquire

(node pred, node node)

while

(pred.waitstatus >0)

; pred.next = node;

}else

return

false

;}

private

final

boolean

parkandcheckinterrupt()

lock方法的整個過程,基本就是這樣,執行緒由阻塞狀態轉為非阻塞狀態,是在state為0時,頭節點會喚醒下一節點的執行緒。

unlock() 方法後續分析

ReentranLock重入鎖原始碼分析

今天來分析一下重入鎖的原始碼 重入鎖reentranlock是一種支援重進入的鎖,表示該鎖可以支援乙個執行緒對資源重複加鎖,並且分為公平鎖和非公平鎖 synchronized大家一定都很熟悉了,這也是一種隱式的重入鎖,是一種非公平鎖 當執行緒再次獲取鎖時,鎖需要先判斷該執行緒是否為當前佔據鎖的執行緒...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

Cartographer原始碼篇 原始碼分析 1

在安裝編譯cartographer 1.0.0的時候,我們可以看到 主要包括cartorgarpher ros cartographer ceres sover三個部分。其中,ceres solver用於非線性優化,求解最小二乘問題 cartographer ros為ros平台的封裝,獲取感測器資料...