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