首頁(yè)技術(shù)文章正文

Synchronized和Reentrantlock的區(qū)別有哪些?

更新時(shí)間:2020-12-08 來(lái)源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

ReentrantLock是Lock的實(shí)現(xiàn)類,是一個(gè)互斥的同步鎖。從功能角度,ReentrantLock比Synchronized的同步操作更精細(xì)(因?yàn)榭梢韵衿胀▽?duì)象一樣使用),甚至實(shí)現(xiàn)Synchronized沒(méi)有的高級(jí)功能,如:

·等待可中斷:當(dāng)持有鎖的線程長(zhǎng)期不釋放鎖的時(shí)候,正在等待的線程可以選擇放棄等待,對(duì)處理執(zhí)行時(shí)間非常長(zhǎng)的同步塊很有用。

·帶超時(shí)的獲取鎖嘗試:在指定的時(shí)間范圍內(nèi)獲取鎖,如果時(shí)間到了仍然無(wú)法獲取則返回。

·可以判斷是否有線程在排隊(duì)等待獲取鎖可以響應(yīng)中斷請(qǐng)求與Synchronized不同,當(dāng)獲取到鎖的線程被中斷時(shí),能夠響應(yīng)中斷,中斷異常將會(huì)被拋出,同時(shí)鎖會(huì)被釋放。

·可以實(shí)現(xiàn)公平鎖。

從鎖釋放角度, Synchronized在JVM層面上實(shí)現(xiàn)的,不但可以通過(guò)一些監(jiān)控工具監(jiān)控 Synchronized的鎖定,而且在代碼執(zhí)行岀現(xiàn)異常時(shí),JVM會(huì)自動(dòng)釋放鎖定;但是使用Locκ則不行,Lock是通過(guò)代碼實(shí)現(xiàn)的,要保證鎖定一定會(huì)被釋放,就必須將unlock()放到finally{}中。

從性能角度,Synchronized早期實(shí)現(xiàn)比較低效,對(duì)比ReentrantLock,大多數(shù)場(chǎng)景性能都相差較大。但是在Java 6中對(duì)其進(jìn)行了非常多的改進(jìn),在競(jìng)爭(zhēng)不激烈時(shí),Synchronized的性能要優(yōu)于ReetrantLock;在高競(jìng)爭(zhēng)情況下,Synchronized的性能會(huì)下降幾十倍,但是ReetrantLock的性能能維持常。



猜你喜歡

反射機(jī)制應(yīng)用:DAO抽取通用層實(shí)現(xiàn)

ZooKeeper面試題和答案匯總

Dubbo相關(guān)面試題附答案

Java高級(jí)軟件工程師培訓(xùn)課程

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!