Synchronized和Lock的區(qū)別

1.synchronized是一個(gè)關(guān)鍵字而lock是一個(gè)接口(lock、lockInterruptibly、tryLock、unlock、newCondition)。
2.synchronized是隱式的加鎖,lock是顯示的加鎖。
3.synchronized可以作用在方法和代碼塊上,而lock只能作用在代碼塊上。
synchronized作用在靜態(tài)方法上鎖的是當(dāng)前類(lèi)的class,作用在普通方法上鎖的是當(dāng)前類(lèi)的對(duì)象。
在javap反編譯成字節(jié)碼后,synchronized關(guān)鍵字需要有一個(gè)代碼塊進(jìn)入的點(diǎn)monitorenter,代碼塊退出和代碼塊異常的出口點(diǎn)monitorexit。
4.synchronized是阻塞式加鎖,而lock中的trylock支持非阻塞式加鎖。
5.synchronized沒(méi)有超時(shí)機(jī)制,而lock中的trylcok可以支持超時(shí)機(jī)制。
6.synchronized不可中斷,而lock中的lockInterruptibly可中斷的獲取鎖。(ReentrantLock.lockInterruptibly允許在等待時(shí)由其它線(xiàn)程調(diào)用等待線(xiàn)程的Thread.interrupt方法來(lái)中斷等待線(xiàn)程的等待而直接返回,這時(shí)不用獲取鎖,而會(huì)拋出一個(gè)InterruptedException。 ReentrantLock.lock方法不允許Thread.interrupt中斷,即使檢測(cè)到Thread.isInterrupted,一樣會(huì)繼續(xù)嘗試獲取鎖,失敗則繼續(xù)休眠。只是在最后獲取鎖成功后再把當(dāng)前線(xiàn)程置為interrupted狀態(tài),然后再中斷線(xiàn)程。)
7.synchronized采用的是monitor對(duì)象監(jiān)視器,lock的底層原理是AQS
8.synchronized只有一個(gè)同步隊(duì)列和一個(gè)等待隊(duì)列,而lock有一個(gè)同步隊(duì)列,可以有多個(gè)等待隊(duì)列。
同步隊(duì)列:排隊(duì)取鎖的線(xiàn)程所在的隊(duì)列。
等待隊(duì)列:調(diào)用 wait 方法后,線(xiàn)程會(huì)從同步隊(duì)列轉(zhuǎn)移到等待隊(duì)列。
9.synchronized是非公平鎖,而lock可以是公平鎖也可以是非公平鎖。
10.synchronized用object的notify方法進(jìn)行喚醒,而lock用condition進(jìn)行喚醒。
11.lock有ReadWriteLock支持并發(fā)讀。

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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