ReentrantLock原始碼解析(三) 總結

2021-08-02 17:12:05 字數 2405 閱讀 6985

常用方式:

int a = 12;

//注意:通常情況下,這個會設定成乙個類變數,比如說segement中的段鎖與copyonwritearraylist中的全域性鎖

final reentrantlock lock = new

reentrantlock();

lock.lock();

//獲取鎖

try catch

(exception e)

finally

1、非公平鎖獲取鎖的步驟lock()

基於cas嘗試將state(鎖數量)從0設定為1

a、如果設定成功,設定當前執行緒為獨佔鎖的執行緒;

b、如果設定失敗,還會再獲取一次鎖數量,

b1、如果鎖數量為0,再基於cas嘗試將state(鎖數量)從0設定為1一次,如果設定成功,設定當前執行緒為獨佔鎖的執行緒;

b2、如果鎖數量不為0或者上邊的嘗試又失敗了,檢視當前執行緒是不是已經是獨佔鎖的執行緒了,如果是,則將當前的鎖數量+1;

如果不是,則將該執行緒封裝在乙個node內,並加入到等待佇列中去。等待被其前乙個執行緒節點喚醒。

2、公平鎖獲取鎖的步驟lock()

獲取一次鎖數量,

b1、如果鎖數量為0,如果當前執行緒是等待佇列中的頭節點,基於cas嘗試將state(鎖數量)從0設定為1一次,如果設定成功,設定當前執行緒為獨佔鎖的執行緒;

b2、如果鎖數量不為0或者當前執行緒不是等待佇列中的頭節點或者上邊的嘗試又失敗了,檢視當前執行緒是不是已經是獨佔鎖的執行緒了,如果是,則將當前的鎖數量+1;如果不是,則將該執行緒封裝在乙個node內,並加入到等待佇列中去。等待被其前乙個執行緒節點喚醒。

3、解鎖的步驟

1)獲取當前的鎖數量,然後用這個鎖數量減去解鎖的數量(這裡為1),最後得出結果c

2)判斷當前執行緒是不是獨佔鎖的執行緒,如果不是,丟擲異常

3)如果c==0,說明鎖被成功釋放,將當前的獨佔執行緒置為null,鎖數量置為0,返回true

4)如果c!=0,說明釋放鎖失敗,鎖數量置為c,返回false

5)如果鎖被釋放成功的話,喚醒距離頭節點最近的乙個非取消的節點

4、reentrantlock的四種獲取鎖方法對比

/**

*獲取乙個鎖

*三種情況:

*1、如果當下這個鎖沒有被任何執行緒(包括當前執行緒)持有,則立即獲取鎖,鎖數量==1,之後再執行相應的業務邏輯

*2、如果當前執行緒正在持有這個鎖,那麼鎖數量+1,之後再執行相應的業務邏輯

*3、如果當下鎖被另乙個執行緒所持有,則當前執行緒處於休眠狀態,直到獲得鎖之後,當前執行緒被喚醒,鎖數量==1,再執行相應的業務邏輯

* 簡言之,獲取鎖,如果鎖無法獲取,當前執行緒被阻塞,直到鎖可以獲取並獲取成功為止。

*/public

void

lock()

/*** lockinterruptibly():

* 1、 在當前執行緒沒有被中斷的情況下獲取鎖。

* 2、如果獲取成功,方法結束。

* 3、如果鎖無法獲取,當前執行緒被阻塞,直到下面情況發生:

* 1)當前執行緒(被喚醒後)成功獲取鎖

* 2)當前執行緒被其他執行緒中斷

*/public

void lockinterruptibly() throws

interruptedexception

/*** 四點注意:

* 1、如果其他執行緒沒有持有這個鎖,立即返回true,設定鎖的數量為1

* 2、如果當前執行緒已經持有這個鎖了,那麼鎖數量+1,立即返回true

* 3、如果其他執行緒占有這個鎖,該方法立即返回false

* 4、要注意:這個鎖是非公平鎖(即無法用於公平鎖策略中)

*/public

boolean

trylock()

/*** 在指定時間內這個鎖某個時刻沒有被其他執行緒占有並且當前執行緒沒有被中斷,獲得這個鎖

* * 1)如果沒有其他執行緒占有這個鎖,則獲得這個鎖,立即返回true,鎖數量+1

* 2)如果當前執行緒已經持有這個鎖了,那麼鎖數量+1,立即返回true

* 3)如果這個鎖被其他執行緒持有,當前執行緒阻塞,直到下面三種情況發生:

* a、當前執行緒(被喚醒後)成功的獲取鎖

* b、其他執行緒中斷了當前執行緒

* c、指定時間超時(如果時間<=0,根本就不會等待)

* * 如果該鎖被用於公平鎖:如果有其他執行緒在等待,即使判斷出沒有其他執行緒占有這個鎖,當前執行緒也不會獲取這個鎖

*/public

boolean trylock(long timeout, timeunit unit) throws

interruptedexception

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