ReentrantLock的lock:
NonfairSync:(繼承了自SYNC,實(shí)現(xiàn)了部分方法)
final void lock() {
//利用cas將當(dāng)前的state從預(yù)期的0更新為1,如果成功,則直接將當(dāng)前線程設(shè)置為獨(dú)占線程。失敗執(zhí)行else
if(compareAndSetState(0,1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);//調(diào)用AQS的acquire,會(huì)調(diào)用到nonnfairLock的nonfairTryAcquire方法。
}
nonfairTryAcquire方法分析:
final boolean nonfairTryAcquire(intacquires) {
final Thread current = Thread.currentThread();
int c = getState();
if(c ==0) {//如果當(dāng)前的state為0,首先cas更新狀態(tài),如果成功則直接返回,當(dāng)前線程被設(shè)置為獨(dú)占線程。
if(compareAndSetState(0,acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
else if(current == getExclusiveOwnerThread()) { //如果當(dāng)前獨(dú)占線程是當(dāng)前線程,那么更新state這里state大于1的原因是nonfairLock是可重入鎖,所以一個(gè)線程在一次執(zhí)行過程中會(huì)多次獲得鎖。因此當(dāng)前請(qǐng)求獨(dú)占狀態(tài)的線程可能也是當(dāng)前持有獨(dú)占狀態(tài)的線程,還是因?yàn)檫@個(gè)鎖是可重入鎖。
intnextc = c + acquires;
if(nextc <0)// overflow
throw newError("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;//否則返回false(代表當(dāng)前state不等于0,并且當(dāng)前線程不是持有獨(dú)占狀態(tài)的線程,獨(dú)占狀態(tài)被其他線程持有,所以這里返回false)
}
接下來還會(huì)調(diào)用acquireQueued方法,構(gòu)建節(jié)點(diǎn)的方法不再分析(見AQS同步原理),這個(gè)方法的目的是利用循環(huán)cas方法檢測(cè)該節(jié)點(diǎn)的pre節(jié)點(diǎn)是頭節(jié)點(diǎn)并且該節(jié)點(diǎn)可以獲取到獨(dú)占狀態(tài),這個(gè)時(shí)候?qū)⒃摴?jié)點(diǎn)設(shè)置為頭節(jié)點(diǎn),可以理解為獲取鎖成功。
對(duì)ReentrantLock的lock方法的理解需要時(shí)刻記住這是一個(gè)可重入鎖!
這個(gè)時(shí)候nonfairLock的lock方法就結(jié)束了