synchronized和java.util.concurrent.locks.Lock比較

synchronized和java.util.concurrent.locks.Lock比較

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


分享到:


相關文章: