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