- 原始構成
- Synchronized 是關鍵字,屬於JVM層面,底層是通過 monitorenter 和 monitorexit 完成,依賴於 monitor 對象來完成。由於 wait/notify 方法也依賴於 monitor 對象,因此只有在同步塊或方法中才能調用這些方法。
- Lock 是 java.util.concurrent.locks.lock 包下的,是 api層面的鎖。
- 使用方法
- Synchronized 不需要用戶手動釋放鎖,代碼完成之后系統自動讓線程釋放鎖
- ReentrantLock 需要用戶手動釋放鎖,沒有手動釋放可能導致死鎖。
- 等待是否可以中斷
- Synchronized 不可中斷,除非拋出異常或者正常運行完成
- ReentrantLock 可以中斷。一種是通過
tryLock(long timeout, TimeUnit unit),另一種是lockInterruptibly()放代碼塊中,調用interrupt()方法進行中斷。
- 加鎖是否公平
- synchronized 是非公平鎖
- ReentrantLock 默認非公平鎖,可以在構造方法傳入 boolean 值,true 代表公平鎖,false 代表非公平鎖。
- 鎖綁定多個 Condition
- Synchronized 只有一個阻塞隊列,只能隨機喚醒一個線程或者喚醒全部線程。
- ReentrantLock 用來實現分組喚醒,可以精確喚醒。
