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ī)制。