ReentrantLock重入鎖原始碼分析

2021-10-20 16:22:30 字數 1951 閱讀 1602

顧名思義:支援可重入的鎖,synchronized以實支援重入的鎖。它表示能夠支援乙個執行緒重複獲取同乙個鎖物件或者說能夠支援同乙個執行緒對資源的重複加鎖。

同時reentrantlock還支援公平鎖和非公平鎖的選擇,預設為非公平鎖,公平鎖的效率要比非公平鎖的效率低。

當同步佇列中有多個執行緒在等待時,等待時間最長的執行緒優先獲得鎖。

公平鎖的對立就非公平鎖,即不管等待時間的長短。

以公平鎖為例主要思想為:

reentrantlock通過組合自定義同步器來實現鎖的獲取於釋放的。

**nonfairsync#lock

final

void

lock()

最終呼叫到sync#nonfairtryacquire(int acquires),此處為重入鎖的語義實現

final

boolean

nonfairtryacquire

(int acquires)

}else

if(current ==

getexclusiveownerthread()

)//如果不是重入鎖,返回false

return

false

;}

//釋放鎖,公平鎖和非公平鎖都使用這乙個

//sync自定義同步器內部類實現

protected

final

boolean

tryrelease

(int releases)

setstate

(c);

return free;

區別就是多了一步判斷當前節點是否為同步佇列的第乙個。

//公平鎖

protected

final

boolean

tryacquire

(int acquires)

}else

if(current ==

getexclusiveownerthread()

)return

false

;}

測試結果

非公平鎖:

公平鎖:

由結果可見,非公平鎖可能會出現剛剛釋放鎖的執行緒又獲取到鎖的情況,使得其他執行緒只能在同步佇列中等待,如果把每次不同執行緒獲取到鎖定義為1次切換,那麼公平鎖的切換次數顯然比非公平鎖多。

reentrantlock還提供了條件condition,對執行緒的等待、喚醒操作更加詳細和靈活

reentrantlock提供了可輪詢的鎖請求,它會嘗試著去獲取鎖,如果成功則繼續,否則可以等到下次執行時再處理,而synchronized則一旦進入鎖請求要麼成功要麼阻塞,reentrantlock更不容易產生死鎖

reentrantlock支援更加靈活的同步**快,但是使用synchronized時,只能在同乙個synchronized塊結構中獲取和釋放。reentrantlock的鎖釋放一定要在finally中處理,否則可能會產生嚴重後果。reentrantlock支援中斷處理,且效能較synchronzied會好些

可重入鎖reentrantLock

reentrantlock可重入獨佔鎖 獨佔 就是在同一時刻只能有乙個執行緒獲取到鎖,而其它獲取鎖的執行緒只能處於同步佇列中等待,只有獲取鎖的執行緒釋放了鎖,後繼的執行緒才能夠獲取鎖。可重入 就是支援重進入的鎖,它表示該鎖能夠支援乙個執行緒對資源的重複加鎖。a.公平鎖和非公平鎖 當b執行緒請求鎖,發...

ReentrantLock可重入鎖

reentrantlock,是乙個可重入且獨佔式的鎖,是一種遞迴無阻塞的同步鎖。和synchronized關鍵字相比,它更靈活 更強大,增加了輪詢 超時 中斷等高階功能。步驟1 reentrantlock的遞迴實現public class reentrantlockdemo 次 n if n 2 c...

重入鎖ReentrantLock常用方法(三)

1.isheldbycurrentthread 查詢當前執行緒是否保持鎖定。islocked 查詢是否存在任意執行緒保持此鎖定。public class reentrantlockmethodtest7 finally public static void main string args thre...