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