Synchronized和Lock有什么区别
前言
早期的時候我們對線程的主要操作為:
-
synchronized wait?notify
然后后面出現了替代方案
-
lock await singal
問題
synchronized 和 lock 有什么區別?用新的lock有什么好處?舉例說明
1)原始構成
- synchronized屬于JVM層面,屬于java的關鍵字
? ? ? ? ? ? ?monitorenter(底層是通過monitor對象來完成,其實wait/notify等方法也依賴于monitor對象 只能在同步塊或者方法中才能調用 wait/ notify等方法)
-
Lock是具體類(java.util.concurrent.locks.Lock)是api層面的鎖
2)使用方法:
-
synchronized:不需要用戶去手動釋放鎖,當synchronized代碼執行后,系統會自動讓線程釋放對鎖的占用
-
ReentrantLock:則需要用戶去手動釋放鎖,若沒有主動釋放鎖,就有可能出現死鎖的現象,需要lock() 和 unlock() 配置try catch語句來完成
3)等待是否中斷
-
synchronized:不可中斷,除非拋出異?;蛘哒_\行完成
-
ReentrantLock:可中斷,可以設置超時方法
-
設置超時方法,trylock(long timeout, TimeUnit unit)
-
lockInterrupible() 放代碼塊中,調用interrupt() 方法可以中斷
-
4)加鎖是否公平
-
synchronized:非公平鎖
-
ReentrantLock:默認非公平鎖,構造函數可以傳遞boolean值,true為公平鎖,false為非公平鎖
5)鎖綁定多個條件Condition
-
synchronized:沒有,要么隨機,要么全部喚醒
-
ReentrantLock:用來實現分組喚醒需要喚醒的線程,可以精確喚醒,而不是像synchronized那樣,要么隨機,要么全部喚醒
總結
以上是生活随笔為你收集整理的Synchronized和Lock有什么区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阻塞队列的应用 || 多线程的条件判断
- 下一篇: 锁绑定多个条件Condition