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