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