更新時(shí)間:2022年01月10日17時(shí)24分 來(lái)源:傳智教育 瀏覽次數(shù):
掌握 lock 與 synchronized 的區(qū)別
理解 ReentrantLock 的公平、非公平鎖
理解 ReentrantLock 中的條件變量
lock 與 synchronized 的區(qū)別有三個(gè)層面
語(yǔ)法層面
* synchronized 是關(guān)鍵字,源碼在 jvm 中,用 c++ 語(yǔ)言實(shí)現(xiàn)
* Lock 是接口,源碼由 jdk 提供,用 java 語(yǔ)言實(shí)現(xiàn)
* 使用 synchronized 時(shí),退出同步代碼塊鎖會(huì)自動(dòng)釋放,而使用 Lock 時(shí),需要手動(dòng)調(diào)用 unlock 方法釋放鎖
* 二者均屬于悲觀鎖、都具備基本的互斥、同步、鎖重入功能
* Lock 提供了許多 synchronized 不具備的功能,例如獲取等待狀態(tài)、公平鎖、可打斷、可超時(shí)、多條件變量
* Lock 有適合不同場(chǎng)景的實(shí)現(xiàn),如 ReentrantLock, ReentrantReadWriteLock
* 在沒(méi)有競(jìng)爭(zhēng)時(shí),synchronized 做了很多優(yōu)化,如偏向鎖、輕量級(jí)鎖,性能不賴
* 在競(jìng)爭(zhēng)激烈時(shí),Lock 的實(shí)現(xiàn)通常會(huì)提供更好的性能
公平鎖的公平體現(xiàn)
已經(jīng)處在阻塞隊(duì)列**中的線程(不考慮超時(shí))始終都是公平的,先進(jìn)先出
公平鎖是指**未處于阻塞隊(duì)列**中的線程來(lái)爭(zhēng)搶鎖,如果隊(duì)列不為空,則老實(shí)到隊(duì)尾等待
非公平鎖是指**未處于阻塞隊(duì)列**中的線程來(lái)爭(zhēng)搶鎖,與隊(duì)列頭喚醒的線程去競(jìng)爭(zhēng),誰(shuí)搶到算誰(shuí)的
公平鎖會(huì)降低吞吐量,一般不用
* ReentrantLock 中的條件變量功能類似于普通 synchronized 的 wait,notify,用在當(dāng)線程獲得鎖后,發(fā)現(xiàn)條件不滿足時(shí),臨時(shí)等待的鏈表結(jié)構(gòu)
* 與 synchronized 的等待集合不同之處在于,ReentrantLock 中的條件變量可以有多個(gè),可以實(shí)現(xiàn)更精細(xì)的等待、喚醒控制
代碼說(shuō)明
day02.TestReentrantLock 用較為形象的方式演示 ReentrantLock 的內(nèi)部結(jié)構(gòu)
Java培訓(xùn)之java難點(diǎn)解析(十五)-Lock接口
Synchronized原理是什么?Synchronized原理詳解
鴻蒙系統(tǒng)和安卓有哪些區(qū)別?鴻蒙會(huì)取代安卓嗎?
2021-12-29DevEco Studio項(xiàng)目結(jié)構(gòu)介紹【Java開(kāi)發(fā)手機(jī)應(yīng)用】
2021-12-22鴻蒙OS系統(tǒng)開(kāi)發(fā)初體驗(yàn):預(yù)安裝DevEco Studio工具
2021-12-22Log4j有什么作用?它主要由哪三部分組成?【Log4j面試問(wèn)題】
2021-12-16三目運(yùn)算符什么意思?三目運(yùn)算符怎么用?
2021-12-14Java構(gòu)造器(構(gòu)造函數(shù))使用注意問(wèn)題和實(shí)例教程【詳細(xì)介紹】
2021-12-14北京校區(qū)