ReentrantLock學習
公平鎖和非公平鎖的區別
前面在AQS學習一文中已經提到過了公平鎖的整個流程,所以現在來看一下非公平鎖
首先是關於ReentrantLock的默認表現形式。
總共有2個構造器,由下面的代碼可知,默認實現的是非公平鎖,但是也可以傳入參數控制是公平鎖還是非公平鎖。
public ReentrantLock() {
sync = new NonfairSync();
}
/*********************************************************************/
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
下面來看一下非公平鎖的具體實現
主要區別就是下面三個方法
final void lock() {
//相較於公平鎖,當調用lock的時候就先嚐試CAS獲得鎖
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
//如果失敗就和公平鎖一樣進入acquire方法,既然一樣就不寫了
acquire(1);
}
//進入acquire,首先會嘗試tryAcquire
protected 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);
return true;
}
}
else if (current == getExclusiveOwnerThread()) {
//省略不重要的
}
return false;
}
所以,大致就兩處不同,就是非公平鎖第一次進入lock的時候會先嚐試獲得鎖,然後再nonfairTryAcquire中,不再判斷阻塞隊列中的元素,也是直接嘗試獲得鎖。別的地方就基本一樣,獲得鎖失敗之後進入阻塞隊列。