Synchronized 和 ReentrantLock (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 用來實現分組喚醒,可以精確喚醒。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM