可重入鎖reentrantLock

2021-09-29 01:49:40 字數 1085 閱讀 6485

reentrantlock可重入獨佔鎖:

「獨佔」

,就是在同一時刻只能有乙個執行緒獲取到鎖,而其它獲取鎖的執行緒只能處於同步佇列中等待,只有獲取鎖的執行緒釋放了鎖,後繼的執行緒才能夠獲取鎖。

「可重入」

,就是支援重進入的鎖,它表示該鎖能夠支援乙個執行緒對資源的重複加鎖。

a.公平鎖和非公平鎖:

當b執行緒請求鎖,發現a執行緒正持有鎖,就陷入阻塞,當a執行緒釋放鎖,b執行緒還未獲得鎖的時候,c執行緒來了並請求鎖

公平鎖:

c執行緒請求鎖,c執行緒發現b執行緒阻塞佇列裡有b執行緒,就進入阻塞佇列等待,同時,b執行緒發現a釋放鎖,就從等待佇列裡喚醒,並持有鎖。

非公平鎖:

c執行緒請求鎖,c執行緒與b執行緒競爭,存在b繼續進入阻塞,同時,c執行緒持有鎖的可能性

總結:1.公平鎖維護了先來先處理的順序,進行鎖的請求,所以,公平鎖不會產生飢餓

2.非公平鎖每次釋放鎖後,請求鎖的執行緒相互競爭,隨機選擇乙個執行緒持有鎖。

3.在鎖釋放時,從阻塞佇列順序喚醒執行緒處理請求是公平鎖,相互競爭隨機選取是非公平鎖

b.reentrantlock鎖支援公平鎖和非公平鎖

1.中斷響應(lockinterruptibly)等待鎖的過程中可以取消對鎖的請求---即阻塞可以被中斷

2.鎖申請等待限時(trylock)指定等待鎖的時間,過期即放棄---指定時間阻塞,過期就放棄

以上兩種機制都可以防止死鎖的產生

c.public reentrantlock(boolean fair):通過該構造方法設定鎖的公平性

思考:如果是可重入鎖的公平鎖,那麼如何體現可重入性呢?之前這點一直有些想不通,感覺可重入鎖就只有非公平的鎖呀。

公平鎖的重點,裡面用了佇列來實現鎖,如果佇列中第乙個為空或者自己是第乙個,就自己再去獲取資源,如果有值了,就判斷乙個自己之前是不是已經獲取過資源了,獲取了就在重入一下,重入失敗就返回false,表示獲取資源失敗

參考:《reentrantlock之公平鎖,可重入的理解》

java併發 重入鎖 ReentrantLock

使用 github主頁 重入鎖,標識在乙個執行緒中,可重複對該資源重複加鎖。針對於aqs實現重入功能 在重寫tryaquires 的時候考慮同乙個執行緒多次lock的情況即可 偽 thread currentthread thread.currentthread getexclusiveownert...

可重入鎖 不可重入鎖

可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...

鎖 可重入鎖

reetrantlick相對於 synchronized 的優勢 reentrantlock獨有的能力 1.reentrantlock可以指定是公平鎖還是非公平鎖。而synchronized只能是非公平鎖。所謂的公平鎖就是先等待的執行緒先獲得鎖。2.reentrantlock提供了乙個conditi...