ReentrantLock學習(待更

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中,不再判斷阻塞隊列中的元素,也是直接嘗試獲得鎖。別的地方就基本一樣,獲得鎖失敗之後進入阻塞隊列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章