
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、reentrantlock是如何基于aqs實(shí)現(xiàn)的reentrantlock是一個可重入的互斥鎖,基于aqs實(shí)現(xiàn),它具有與用法 synchronized 辦法和語句相同的一些基本行為和語義,但功能更強(qiáng)大。lock和unlockreentrantlock 中舉行同步操作都是從lock辦法開頭。lock獵取鎖,舉行一系列的業(yè)務(wù)操作,結(jié)束后用法unlock釋放鎖。private final reentrantlock lock = new reentrantlock();public void sync()lock.lock();try / method body finally lock.unloc
2、k()lockreentrantlock 中l(wèi)ock的實(shí)現(xiàn)是通過調(diào)用aqs的 abstractqueuedsynchronizeracquire 辦法實(shí)現(xiàn)。public final void acquire(int arg) /嘗試獵取鎖if (!tryacquire(arg) &&acquirequeued(addwaiter(node.exclusive), arg)selfinterrupt();按照之前介紹的模板辦法模式,對于鎖的獵取tryacquire是在reentrantlock中實(shí)現(xiàn)的。而非公正鎖中的實(shí)際實(shí)現(xiàn)辦法為nonfairtryacquire。reentra
3、ntlocknonfairtryacquireprotected final boolean tryacquire(int acquires) return nonfairtryacquire(acquires);final boolean nonfairtryacquire(int acquires) final thread current = thread.currentthread();int c = getstate();if (c = 0) if (compareandsetstate(0, acquires) setexclusiveownerthread(current);re
4、turn true;else if (current = getexclusiveownerthread() int nextc = c + acquires;if (nextc 0) do node.prev = pred = pred.prev; while (pred.waitstatus 0);pred.next = node; else compareandsetwaitstatus(pred, ws, node.signal);return false;推斷一個節(jié)點(diǎn)是否需要被堵塞是通過該節(jié)點(diǎn)的前繼節(jié)點(diǎn)的狀態(tài)推斷的。假如前繼節(jié)點(diǎn)狀態(tài)為 singal ,則表示前繼節(jié)點(diǎn)還在等待,當(dāng)前節(jié)點(diǎn)
5、需要繼續(xù)被堵塞。返回true。假如前繼節(jié)點(diǎn)大于0,則表示前繼節(jié)點(diǎn)為取消狀態(tài)。取消狀態(tài)的節(jié)點(diǎn)不參加鎖的競爭,挺直跳過。返回false。假如前繼節(jié)點(diǎn)時其他狀態(tài)(0,propagate),不舉行堵塞,表示當(dāng)前節(jié)點(diǎn)需要重試嘗試獵取鎖。返回false。shouldparkafterfailedacquire辦法假如返回true,表示需要將當(dāng)前節(jié)點(diǎn)堵塞,堵塞辦法為parkandcheckinterrupt。abstractqueuedsynchronizerparkandcheckinterruptprivate final boolean parkandcheckinterrupt() locksupp
6、ort.park(this);return terrupted();堵塞是通過locksupport舉行堵塞,被堵塞的節(jié)點(diǎn)不參加鎖的競爭(不在舉行循環(huán)獵取鎖),只能被unpark后才繼續(xù)競爭鎖。而被堵塞的節(jié)點(diǎn)要被釋放則依靠于unlock辦法。unlockreentrantlock 中unlock的實(shí)現(xiàn)是通過調(diào)用aqs的 abstractqueuedsynchronizerrelease 辦法實(shí)現(xiàn)。public final boolean release(int arg) if (tryrelease(arg) node h = head;if (h != null &
7、& h.waitstatus != 0)unparksuccessor(h);return true;return false;release調(diào)用tryrelease辦法,tryrelease是在 reentrantlock 中實(shí)現(xiàn)。reentrantlocktryreleaseprotected final boolean tryrelease(int releases) int c = getstate() - releases;if (thread.currentthread() != getexclusiveownerthread()throw new illegalmonit
8、orstateexception();boolean free = false;if (c = 0) free = true;setexclusiveownerthread(null);setstate(c);return free;tryrelease辦法規(guī)律很容易,首先減去releases(普通為1)表示釋放一個鎖,假如釋放后state=0表示釋放鎖勝利,后續(xù)等待的節(jié)點(diǎn)可以獵取該鎖了。假如state!=0則表示該鎖為重入鎖,需要多次釋放。當(dāng)釋放鎖勝利后(state=0),會對頭結(jié)點(diǎn)的后繼節(jié)點(diǎn)舉行unpark。abstractqueuedsynchronizerunparksuccessor
9、private void unparksuccessor(node node) int ws = node.waitstatus;if (ws 0) s = null;for (node t = tail; t != null && t != node; t = t.prev)if (t.waitstatus 0的節(jié)點(diǎn))。公正鎖和非公正鎖reentrantlock 的構(gòu)造辦法接受一個可選的公正參數(shù)。當(dāng)設(shè)置為 true 時,在多個線程的競爭時,傾向于將鎖分配給等待時光最長的線程。public reentrantlock(boolean fair) sync = fair ? ne
10、w fairsync() : new nonfairsync();在多個鎖競爭統(tǒng)一資源的環(huán)境下,aqs維護(hù)了一個等待隊(duì)列,未能獵取到鎖的線程都會被掛到該隊(duì)列中。假如用法公正鎖則會從隊(duì)列的頭結(jié)點(diǎn)開頭獵取該資源。而按照代碼在公正鎖和非公正鎖的實(shí)現(xiàn)的差別僅僅在于公正鎖多了一個檢測的辦法。公正鎖protected final boolean tryacquire(int acquires) /if (c = 0) if (!hasqueuedpredecessors() /!hasqueuedpredecessors()便是比非公正鎖多出來的操作&& compareandsetstate(0, acquires) setexclusiveownerthread(current);return true;/return false;hasqueuedpredecessors()public final boolean hasqueuedpredecessors() node t = tail; / read fields in reverse initialization ordernode h
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 深入理解教育領(lǐng)域中的大數(shù)據(jù)庫解析
- 從心理角度理解學(xué)生學(xué)習(xí)行為的驅(qū)動力
- 教育心理學(xué)與在線課程學(xué)習(xí)成效的關(guān)系
- 小學(xué)班班通培訓(xùn)課件
- 智慧城市背景下綠色智能辦公樓的發(fā)展
- 教育政策在高校文化傳承中的作用
- 從新政策看未來學(xué)校教育模式的創(chuàng)新
- 大數(shù)據(jù)在學(xué)生個性化教學(xué)計(jì)劃制定中的作用
- 抖音商戶數(shù)據(jù)分析師直播數(shù)據(jù)看板制度
- 抖音商戶直播時段選擇依據(jù)制度
- 廣告牌的施工方案
- 手提式國產(chǎn)汽油發(fā)電機(jī)安全操作規(guī)程
- 《湍流中大尺度結(jié)構(gòu)對小尺度結(jié)構(gòu)的影響》
- 安徽省合肥市廬陽區(qū)南門小學(xué)-2024-2025年第一學(xué)期辦公室工作總結(jié)(層峰辟新天)【課件】
- 國家社科基金申報(bào)經(jīng)驗(yàn)分享-課件
- DB31∕T 360-2020 住宅物業(yè)管理服務(wù)規(guī)范
- 基于多模態(tài)數(shù)據(jù)的智慧化平衡功能評估系統(tǒng)應(yīng)用研究
- 外研版(2024)七年級上冊單詞默寫
- JGJT502-2024《預(yù)應(yīng)力裝配式混凝土框架結(jié)構(gòu)技術(shù)標(biāo)準(zhǔn)》
- 土木工程CAD-終結(jié)性考核-國開(SC)-參考資料
- 手術(shù)室??瓶荚囶}庫與答案
評論
0/150
提交評論