談?wù)?synchronized 和 ReentrantLock 的區(qū)別

① 兩者都是可重入鎖

“可重入鎖”概念是:自己可以再次獲取自己的內(nèi)部鎖。比如,一個(gè)線程獲得了某個(gè)對(duì)象的鎖,此時(shí)這個(gè)對(duì)象鎖還沒(méi)有釋放,當(dāng)其再次想要獲取這個(gè)對(duì)象的鎖時(shí),還可以再獲取的;如果不可鎖重入的話,就會(huì)造成死鎖;同一個(gè)線程每次獲取鎖,鎖的計(jì)數(shù)器都自增1,所以要等到鎖的計(jì)數(shù)器下降為0時(shí),才能最終釋放鎖。

② synchronized 依賴于 JVM,而 ReentrantLock 依賴于 API

synchronized 是依賴于 JVM 實(shí)現(xiàn)的,Java 虛擬機(jī)團(tuán)隊(duì)在 JDK1.6 為 synchronized 關(guān)鍵字進(jìn)行了很多的優(yōu)化,但這些優(yōu)化都是在虛擬機(jī)層面實(shí)現(xiàn)的,并沒(méi)有直接暴露給我們。ReentrantLock 是 JDK 層面實(shí)現(xiàn)的(也就是 API 層面,需要 lock() 和 unlock() 方法配合 try/finally 語(yǔ)句塊來(lái)完成),可以通過(guò)查看它的源代碼,來(lái)看它是如何實(shí)現(xiàn)的。

③ ReentrantLock 比 synchronized 增加了一些高級(jí)功能

相比 synchronized,ReentrantLock 增加了一些高級(jí)功能。主要有三點(diǎn):① 等待可中斷;② 可實(shí)現(xiàn)公平鎖;③ 可實(shí)現(xiàn)選擇性通知(鎖可以綁定多個(gè)條件):

  • ReentrantLock 提供了一種能夠中斷等待鎖線程的機(jī)制,通過(guò) lock.lockInterruptibly() 來(lái)實(shí)現(xiàn)這個(gè)機(jī)制,也就是說(shuō)正在等待的線程可以選擇放棄等待,改為處理其他事情;
  • ReentrantLock 可以指定是公平鎖還是非公平,而 synchronized 只能是非公平鎖。所謂的公平鎖,就是先等待的線程最先獲得鎖;ReentrantLock 默認(rèn)是非公平的,可以通過(guò) ReentrantLock 類的 ReentrantLock(boolean fair) 構(gòu)造方法來(lái)制定是否是公平的;
  • synchronized 關(guān)鍵字結(jié)合 wait()notify()/notifyAll() 方法使用,可以實(shí)現(xiàn)等待/通知機(jī)制,ReentrantLock 類則需要借助于 Condition 接口與 newCondition() 方法。Condition 是 JDK1.5 之后才有的,它具有很好的靈活性,比如可以實(shí)現(xiàn)多路通知功能,也就是在一個(gè) Lock 對(duì)象中可以創(chuàng)建多個(gè) Condition 實(shí)例(即對(duì)象監(jiān)視器),線程對(duì)象可以注冊(cè)在指定的 Condition 中,從而可以有選擇性的進(jìn)行線程通知,在調(diào)度線程上更加靈活。 在使用 notify()/notifyAll() 方法進(jìn)行通知時(shí),被通知的線程是由 JVM 選擇的。而 synchronized 關(guān)鍵字就相當(dāng)于整個(gè) Lock 對(duì)象中只有一個(gè) Condition 實(shí)例,所有的線程都注冊(cè)在它一個(gè)身上。如果執(zhí)行 notifyAll() 方法的話,就會(huì)通知所有處于等待狀態(tài)的線程,這樣會(huì)造成很大的效率問(wèn)題,而 Condition 實(shí)例的 signalAll() 方法只會(huì)喚醒注冊(cè)在該 Condition 實(shí)例中的所有等待線程。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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