ReentrantReadWriteLock源碼解析(2)lock

ReentrantReadWriteLock中有2個(gè)對(duì)象ReadLock,WriteLock分別都有l(wèi)ock函數(shù):
readlock.lock()

public final void acquireShared(int arg) {
        if (tryAcquireShared(arg) < 0)
            doAcquireShared(arg);
}

protected final int tryAcquireShared(int unused) {
            Thread current = Thread.currentThread();
            int c = getState();
        
            if (exclusiveCount(c) != 0 && //如果已經(jīng)有寫鎖
                getExclusiveOwnerThread() != current) //且寫鎖線程不是當(dāng)前線程,則獲得鎖失敗返回
                return -1;
            int r = sharedCount(c);
            if (!readerShouldBlock() && //看下面,如果讀不需要被阻塞
                r < MAX_COUNT &&
                compareAndSetState(c, c + SHARED_UNIT)) {//且cas成功,表示獲得到讀鎖
                //下面這一大段都是緩存,提高執(zhí)行效率,可以看上一節(jié)
                if (r == 0) {
                    firstReader = current;
                    firstReaderHoldCount = 1;
                } else if (firstReader == current) {
                    firstReaderHoldCount++;
                } else {
                    HoldCounter rh = cachedHoldCounter;
                    if (rh == null || rh.tid != getThreadId(current))
                        cachedHoldCounter = rh = readHolds.get();
                    else if (rh.count == 0)
                        readHolds.set(rh);
                    rh.count++;
                }
                return 1;
            }
        //如果獲取鎖失敗,則再次去嘗試獲取鎖
            return fullTryAcquireShared(current);
        }

readerShouldBlock分別在公平鎖和非公平鎖中:
FairSync.readerShouldBlock

final boolean readerShouldBlock() {
           //看隊(duì)列中是否有排隊(duì)的線程,公平鎖中只要前面有人在排隊(duì)那么當(dāng)前線程就應(yīng)該被阻塞,不能去競(jìng)爭(zhēng)鎖,必須進(jìn)入排隊(duì)
            return hasQueuedPredecessors();
        }

NonfairSync.readerShouldBlock

final boolean readerShouldBlock() {
         //隊(duì)列中第一個(gè)排隊(duì)的線程(隊(duì)列中第二個(gè)元素)是寫線程
           //非公平鎖中,如果第一個(gè)排隊(duì)的是寫,那么不能去競(jìng)爭(zhēng);如果是讀,讀讀是共享的,而且是非公平,那么就可以去搶一下
            return apparentlyFirstQueuedIsExclusive();
        }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容