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();
}