與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平台的封裝,獲取感測器資料...