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