您好,登錄后才能下訂單哦!
本篇文章為大家展示了java并發(fā)包中的ReentrantLock如何理解,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
java作為一個(gè)流行語(yǔ)言,本身對(duì)并發(fā)的支持也是很好的,JDK中的concurrent包中有一系列的并發(fā)工具來(lái)幫助開(kāi)發(fā)者快速構(gòu)建一個(gè)高并發(fā)系統(tǒng),其中就有并發(fā)開(kāi)發(fā)中不可或缺的跟鎖有關(guān)的接口java.util.concurrent.locks.Lock,而該接口一個(gè)常用的實(shí)現(xiàn)類(lèi)就是ReenTrantLock,下面將深入分析該鎖的實(shí)現(xiàn)。
首先該鎖有哪些特征呢?
一、可重入:
該鎖是可重入鎖。什么意思呢?就是當(dāng)前線程如果已經(jīng)獲取鎖 定,那么再次獲取鎖定時(shí)會(huì)立即獲取成功而不是死鎖,也就是同一個(gè)線程可以多次鎖定,在鎖定的同時(shí)會(huì)有一個(gè)狀態(tài)記錄,記錄當(dāng)前線程鎖定了多少次,在釋放的時(shí)候每釋放一次該狀態(tài)就會(huì)減小1,直至該狀態(tài)減小為0表示鎖已經(jīng)被該線程釋放(所以重復(fù)鎖定多少次就要重復(fù)的釋放多少次),那是否可以無(wú)限鎖定呢?答案是否定的,該狀態(tài)是一個(gè)int類(lèi)型的值,每次重復(fù)鎖定都會(huì)加1,也就是同一線程最多重復(fù)鎖定的次數(shù)等于int所能表示的最大的正整數(shù)。那么如果鎖定次數(shù)超過(guò)了該最大值呢?當(dāng)鎖定次數(shù)超過(guò)該最大值系統(tǒng)將拋出Error,是的,不是異常,而是Error?。?!具體代碼如下:
代碼中當(dāng)nextc小于0時(shí)說(shuō)明發(fā)生了overflow,此時(shí)會(huì)拋出Error。
二、不響應(yīng)中斷:
雖然Lock接口的lock()方法是一個(gè)可能被阻塞的方法(當(dāng)其他線程持有鎖時(shí)當(dāng)前線程需要阻塞等待),但是該方法在阻塞期間并不會(huì)像sleep方法一樣響應(yīng)中斷,也就是說(shuō)如果你在lock()方法阻塞期間使用Thread.interrupt()方法嘗試中斷線程,該線程不會(huì)有任何響應(yīng),但是當(dāng)線程獲取到鎖后你可以使用Thread.interrupted()方法獲取該線程的中斷狀態(tài),此時(shí)將獲取到線程的中斷狀態(tài)是true。
三、可超時(shí):
傳統(tǒng)的synchronize鎖在其他線程取得鎖后只能無(wú)限等待,一直到其他線程釋放鎖后該線程成功獲取到鎖才能往下繼續(xù),而Lock的tryLock方法則允許立即響應(yīng),即如果獲取鎖失敗則立即返回一個(gè)false表示獲取鎖失敗或者等待一段時(shí)間獲取鎖失敗后返回一個(gè)false,該方法意味著如果用戶(hù)長(zhǎng)時(shí)間未獲取到鎖那么就可以嘗試返回并做一些其他處理而不是一直在這里等待獲取鎖,這在某些場(chǎng)景是很有用的。
在具體細(xì)節(jié)上該鎖內(nèi)部有兩個(gè)實(shí)現(xiàn),即公平鎖和非公平鎖,那么非公平鎖相較于公平鎖又有哪些不同呢?公平與否體現(xiàn)在哪兒呢?
公平主要體現(xiàn)在嘗試獲取鎖時(shí)的操作,公平鎖在嘗試獲取鎖的時(shí)候會(huì)先判斷當(dāng)前是否有其他線程已經(jīng)在等待了,如果沒(méi)有才會(huì)嘗試直接獲取鎖,否則會(huì)加入隊(duì)列等待前邊的線程釋放鎖后才會(huì)嘗試獲取鎖。
而非公平鎖則不管當(dāng)前是否已經(jīng)有線程在等待,直接嘗試獲取鎖,獲取失敗才會(huì)加入隊(duì)列等待前邊的線程釋放鎖。
(PS:上述公平鎖和非公平鎖在直接嘗試獲取失敗后都會(huì)再判斷當(dāng)前持有鎖的線程是否是本線程,如果是則也會(huì)獲取成功)
非公平鎖嘗試獲取鎖部分代碼:
公平鎖嘗試獲取鎖部分代碼:
由源代碼很清楚的可以看出公平鎖和非公平鎖的區(qū)別。
最后,什么時(shí)候用Lock什么時(shí)候用synchronize呢?
這里推薦如果需要細(xì)粒度的鎖控制、或者預(yù)計(jì)并發(fā)比較低的時(shí)候可以用Lock,否則就應(yīng)該優(yōu)先考慮synchronize;在高并發(fā)的場(chǎng)景下synchronize性能會(huì)優(yōu)于Lock,而且synchronize的死鎖是可以被檢測(cè)出來(lái)的,出現(xiàn)死鎖時(shí)可以通過(guò)監(jiān)控功能監(jiān)控到,同時(shí)synchronize的性能在最新版本也有了大幅的提升,實(shí)際性能并不比Lock低(作者目前使用的1.8,并且使用幾個(gè)簡(jiǎn)單場(chǎng)景實(shí)際測(cè)試過(guò)),所以如果不是有以上需求或者有其他特殊需求只有Lock能滿(mǎn)足的話,應(yīng)該優(yōu)先考慮使用synchronize,不過(guò)Lock也給我們提供了很好的思路,也算是一個(gè)趨勢(shì)。至于為什么并發(fā)的場(chǎng)景很早就有而Lock只在較新的java中有呢?主要是因?yàn)長(zhǎng)ock依賴(lài)于CAS操作,而CAS原子操作在后來(lái)才有了硬件上的支持,所以在硬件支持CAS操作后語(yǔ)言層面上才有了Lock。
Java的特點(diǎn)有哪些 1.Java語(yǔ)言作為靜態(tài)面向?qū)ο缶幊陶Z(yǔ)言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚?,允許程序員以?xún)?yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡(jiǎn)單性、面向?qū)ο?、分布式、安全性、平臺(tái)獨(dú)立與可移植性、動(dòng)態(tài)性等特點(diǎn)。 3.使用Java可以編寫(xiě)桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。
上述內(nèi)容就是java并發(fā)包中的ReentrantLock如何理解,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。