真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java并發(fā)包中的ReentrantLock如何理解

本篇文章為大家展示了java并發(fā)包中的ReentrantLock如何理解,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為南雄企業(yè)提供專業(yè)的網(wǎng)站建設(shè)、網(wǎng)站制作,南雄網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

java作為一個(gè)流行語言,本身對(duì)并發(fā)的支持也是很好的,JDK中的concurrent包中有一系列的并發(fā)工具來幫助開發(fā)者快速構(gòu)建一個(gè)高并發(fā)系統(tǒng),其中就有并發(fā)開發(fā)中不可或缺的跟鎖有關(guān)的接口java.util.concurrent.locks.Lock,而該接口一個(gè)常用的實(shí)現(xiàn)類就是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ù)的釋放多少次),那是否可以無限鎖定呢?答案是否定的,該狀態(tài)是一個(gè)int類型的值,每次重復(fù)鎖定都會(huì)加1,也就是同一線程最多重復(fù)鎖定的次數(shù)等于int所能表示的最大的正整數(shù)。那么如果鎖定次數(shù)超過了該最大值呢?當(dāng)鎖定次數(shù)超過該最大值系統(tǒng)將拋出Error,是的,不是異常,而是Error?。?!具體代碼如下:

java并發(fā)包中的ReentrantLock如何理解

代碼中當(dāng)nextc小于0時(shí)說明發(fā)生了overflow,此時(shí)會(huì)拋出Error。

二、不響應(yīng)中斷:

    雖然Lock接口的lock()方法是一個(gè)可能被阻塞的方法(當(dāng)其他線程持有鎖時(shí)當(dāng)前線程需要阻塞等待),但是該方法在阻塞期間并不會(huì)像sleep方法一樣響應(yīng)中斷,也就是說如果你在lock()方法阻塞期間使用Thread.interrupt()方法嘗試中斷線程,該線程不會(huì)有任何響應(yīng),但是當(dāng)線程獲取到鎖后你可以使用Thread.interrupted()方法獲取該線程的中斷狀態(tài),此時(shí)將獲取到線程的中斷狀態(tài)是true。

三、可超時(shí):

    傳統(tǒng)的synchronize鎖在其他線程取得鎖后只能無限等待,一直到其他線程釋放鎖后該線程成功獲取到鎖才能往下繼續(xù),而Lock的tryLock方法則允許立即響應(yīng),即如果獲取鎖失敗則立即返回一個(gè)false表示獲取鎖失敗或者等待一段時(shí)間獲取鎖失敗后返回一個(gè)false,該方法意味著如果用戶長時(shí)間未獲取到鎖那么就可以嘗試返回并做一些其他處理而不是一直在這里等待獲取鎖,這在某些場(chǎng)景是很有用的。

在具體細(xì)節(jié)上該鎖內(nèi)部有兩個(gè)實(shí)現(xiàn),即公平鎖和非公平鎖,那么非公平鎖相較于公平鎖又有哪些不同呢?公平與否體現(xiàn)在哪兒呢?

公平主要體現(xiàn)在嘗試獲取鎖時(shí)的操作,公平鎖在嘗試獲取鎖的時(shí)候會(huì)先判斷當(dāng)前是否有其他線程已經(jīng)在等待了,如果沒有才會(huì)嘗試直接獲取鎖,否則會(huì)加入隊(duì)列等待前邊的線程釋放鎖后才會(huì)嘗試獲取鎖。

而非公平鎖則不管當(dāng)前是否已經(jīng)有線程在等待,直接嘗試獲取鎖,獲取失敗才會(huì)加入隊(duì)列等待前邊的線程釋放鎖。

(PS:上述公平鎖和非公平鎖在直接嘗試獲取失敗后都會(huì)再判斷當(dāng)前持有鎖的線程是否是本線程,如果是則也會(huì)獲取成功)

非公平鎖嘗試獲取鎖部分代碼:

java并發(fā)包中的ReentrantLock如何理解

公平鎖嘗試獲取鎖部分代碼:

java并發(fā)包中的ReentrantLock如何理解

由源代碼很清楚的可以看出公平鎖和非公平鎖的區(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è)出來的,出現(xiàn)死鎖時(shí)可以通過監(jiān)控功能監(jiān)控到,同時(shí)synchronize的性能在最新版本也有了大幅的提升,實(shí)際性能并不比Lock低(作者目前使用的1.8,并且使用幾個(gè)簡單場(chǎng)景實(shí)際測(cè)試過),所以如果不是有以上需求或者有其他特殊需求只有Lock能滿足的話,應(yīng)該優(yōu)先考慮使用synchronize,不過Lock也給我們提供了很好的思路,也算是一個(gè)趨勢(shì)。至于為什么并發(fā)的場(chǎng)景很早就有而Lock只在較新的java中有呢?主要是因?yàn)長ock依賴于CAS操作,而CAS原子操作在后來才有了硬件上的支持,所以在硬件支持CAS操作后語言層面上才有了Lock。

Java的特點(diǎn)有哪些

Java的特點(diǎn)有哪些 1.Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,實(shí)現(xiàn)了面向?qū)ο罄碚?,允許程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。 2.Java具有簡單性、面向?qū)ο?、分布式、安全性、平臺(tái)獨(dú)立與可移植性、動(dòng)態(tài)性等特點(diǎn)。 3.使用Java可以編寫桌面應(yīng)用程序、Web應(yīng)用程序、分布式系統(tǒng)和嵌入式系統(tǒng)應(yīng)用程序等。

上述內(nèi)容就是java并發(fā)包中的ReentrantLock如何理解,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


標(biāo)題名稱:java并發(fā)包中的ReentrantLock如何理解
轉(zhuǎn)載源于:http://weahome.cn/article/pjicop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部