在ReentrantLock中很明顯可以看到其中同步包括兩種,分別是公平的FairSync和非公平的NonfairSync。公平鎖的作用就是嚴(yán)格按照線程啟動(dòng)的順序來執(zhí)行的,不允許其他線程插隊(duì)執(zhí)行的;而非公平鎖是允許插隊(duì)的。
默認(rèn)情況下ReentrantLock是通過非公平鎖來進(jìn)行同步的,包括synchronized關(guān)鍵字都是如此,因?yàn)檫@樣性能會(huì)更好。因?yàn)閺木€程進(jìn)入了RUNNABLE狀態(tài),可以執(zhí)行開始,到實(shí)際線程執(zhí)行是要比較久的時(shí)間的。而且,在一個(gè)鎖釋放之后,其他的線程會(huì)需要重新來獲取鎖。其中經(jīng)歷了持有鎖的線程釋放鎖,其他線程從掛起恢復(fù)到RUNNABLE狀態(tài),其他線程請(qǐng)求鎖,獲得鎖,線程執(zhí)行,這一系列步驟。如果這個(gè)時(shí)候,存在一個(gè)線程直接請(qǐng)求鎖,可能就避開掛起到恢復(fù)RUNNABLE狀態(tài)的這段消耗,所以性能更優(yōu)化。
默認(rèn)狀態(tài),使用的ReentrantLock()就是非公平鎖。再參考如下代碼,我們知道ReentrantLock的獲取鎖的操作是通過裝飾模式代理給sync的。
下面參考一下FairSync和NonfairSync對(duì)lock方法的實(shí)現(xiàn):
當(dāng)使用非公平鎖的時(shí)候,會(huì)立刻嘗試配置狀態(tài),成功了就會(huì)插隊(duì)執(zhí)行,失敗了就會(huì)和公平鎖的機(jī)制一樣,調(diào)用acquire()方法,以排他的方式來獲取鎖,成功了立刻返回,否則將線程加入隊(duì)列,知道成功調(diào)用為止。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注