可重入鎖(ReentrantLock)淺析

ReentrantLock模型分類

可重入鎖(ReentrantLock)有兩種獲取鎖的模型,一種是公平鎖,另一種是非公平鎖,區(qū)別在于當(dāng)前線程擁有鎖之后,再次請求獲取鎖時,是否需要再次競爭鎖資源

公平鎖

初始化時,公平鎖內(nèi)部計數(shù)器(volatile int state)計0,無進(jìn)程占有鎖資源。

當(dāng)線程A請求鎖資源時,將 state + 1,此時state = 1,線程A占有鎖資源。

此時有線程B請求鎖資源,因鎖內(nèi)部計數(shù)器不為0,無可用資源,線程B進(jìn)入等待隊列等待鎖資源的釋放。

此時線程A再次請求鎖資源,再次將 state + 1,state = 2 ,線程A仍然占有鎖資源,線程B(其他線程)仍在等待隊列等待鎖資源的釋放。

線程A每次釋放鎖資源,只會將計數(shù)器的值減一,即 state - 1 ,只有當(dāng)state = 0 時,鎖資源才全部釋放,此時鎖會通知隊列喚醒線程B節(jié)點,線程B才能進(jìn)行鎖資源競爭,此時若有線程C在隊列中,C線程繼續(xù)休眠,只有當(dāng)線程B執(zhí)行結(jié)束,C才會被喚醒

當(dāng)線程B獲取鎖資源后,線程A若再次請求鎖資源,則需要通過鎖資源競爭,且鎖資源不被占用。


非公平鎖

非公平鎖和公平鎖最大的區(qū)別在于,當(dāng)線程A執(zhí)行完后,鎖資源釋放,等待隊列中有線程B,在喚醒線程B的過程中,若出現(xiàn)線程C請求鎖,則線程C有很大機(jī)會獲取該鎖,一旦線程C擁有鎖,則線程B繼續(xù)休眠


ReenTrantLock獨有的能力

1.??????ReenTrantLock可以指定是公平鎖還是非公平鎖。而synchronized只能是非公平鎖。所謂的公平鎖就是先等待的線程先獲得鎖。ReentrantLock默認(rèn)的構(gòu)造函數(shù)是創(chuàng)建的非公平鎖,可以通過參數(shù)true設(shè)為公平鎖。

2.??????ReenTrantLock提供了一個Condition(條件)類,用來實現(xiàn)分組喚醒需要喚醒的線程們,即可以綁定多個線程,而不是像synchronized要么隨機(jī)喚醒一個線程要么喚醒全部線程。

3.??????ReenTrantLock提供了一種能夠中斷等待鎖的線程的機(jī)制,通過lock.lockInterruptibly()來實現(xiàn)這個機(jī)制。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容