synchronized 和 Lock 有什麼區別?用新的 Lock 有什麼好處?
-
原始構成
synchronized 是關鍵字,屬於 JVM 層面
monitorenter (底層是通過 monitor 對象來完成的,其實 wait/notify 等方法也依賴與 monitor 對象,只有在同步塊或者方法中才能調用 wait/notify 等方法)
monitorexitLock 是具體的類(java.util.concurrent.locks.Lock)是 api 層面的鎖。
-
使用方法
synchronized 不需要用戶手動釋放鎖,當 synchronized 代碼執行結束後系統會自動讓線程釋放對鎖的佔用
ReentrantLock 則需要用戶手動釋放鎖,若沒有主動釋放鎖,就有可能出現死鎖現象,需要 lock() 和 unlock() 方法配合 try/finally 語句塊來完成
-
等待是否可中斷
synchronized 不可中斷,除非拋出異常或者正常運行完成ReentrantLock 可中斷
- 設置超時方法 tryLock(long timeout, TimeUnit unit)
- lockInterruptibly() 放代碼塊中,調用 interrupted() 方法可中斷
-
加鎖是否公平
synchronized 非公平鎖
ReentrantLock 兩者都可以,默認非公平鎖,構造方法可以傳 boolean 值,true 爲公平鎖、false 爲非公平鎖
-
鎖綁定多個條件 condition
synchronized 沒有
ReentrantLock 用來實現分組喚醒需要喚醒的線程們,可以精確喚醒,而不像 synchronized 要麼隨機喚醒一個線程、要麼喚醒全部線程