這篇文章將為大家詳細(xì)講解有關(guān)Java并發(fā)之ReentrantLock類的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

ReentrantLock內(nèi)部由Sync類實(shí)例實(shí)現(xiàn)。

Sync類定義于ReentrantLock內(nèi)部。

Sync繼承于AbstractQueuedSynchronizer。
AbstractQueuedSynchronizer繼承于AbstractOwnableSynchronizer。
AbstractOwnableSynchronizer類中只定義了一個(gè)exclusiveOwnerThread變量,表示當(dāng)前擁有的線程。

除了Sync類,ReentrantLock內(nèi)部還定義了兩個(gè)實(shí)現(xiàn)類。

NonfairSync是非公平鎖。FairSync 是公平鎖。
ReentrantLock兩個(gè)構(gòu)造方法如下:

ReentrantLock的lock方法

非公平鎖的lock方法

compareAndSetState方法是一個(gè)CAS方法。該方法嘗試去更新對象內(nèi)的一個(gè)變量。變量期望是0,更新為1。
若更新成功,則將exclusiveOwnerThread變量設(shè)置為當(dāng)前線程。然后lock方法會立刻返回。
若更新不成功,則調(diào)用acquire(1)。

acquire方法中首先調(diào)用tryAcquire()再次嘗試更新。
非公平鎖的tryAcquire()方法如下:

非公平鎖的tryAcquire()方法內(nèi)部調(diào)用nonfairTryAcquire方法如下:

若tryAcquire()方法再次嘗試不成功。則首先會調(diào)用addWaiter()方法,將當(dāng)前線程加入等待隊(duì)列。addWaiter方法返回一個(gè)Node節(jié)點(diǎn)。

返回節(jié)點(diǎn)后,acquireQueued(node,1)會再次嘗試去做更新。

若還是無法更新,則通過parkAndCheckInterrupt將線程掛起。

ReentrantLock的unlock方法

查看release()方法。

若隊(duì)列的head不為空,且head的等待狀態(tài)不為0,則調(diào)用unparkSuccessor()方法。
unparkSuccessor()方法如下:

使node的next從后向前遍歷,獲取到隊(duì)列中最前面的一個(gè)waitStatus小于0的線程。然后將節(jié)點(diǎn)上的線程繼續(xù)執(zhí)行。
關(guān)于“Java并發(fā)之ReentrantLock類的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯(cuò),請把它分享出去讓更多的人看到。
文章題目:Java并發(fā)之ReentrantLock類的示例分析-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://chinadenli.net/article22/gshjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、品牌網(wǎng)站制作、App開發(fā)、網(wǎng)站改版、品牌網(wǎng)站建設(shè)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容