Java 併發程式設計(十一) -- ReentrantLock中的公平鎖FairSync

我很醜發表於2020-03-15

1. 類的定義

static final class FairSync extends Sync
複製程式碼

從類的定義中可以看出

  • FairSync是ReentrantLock中的一個靜態內部類,並且使用final修飾,表示不可繼承
  • FairSync 繼承了Sync,表明FairSync也是AbstractQueuedSynchronizer的子類

2. 欄位屬性

//序列化版本號
private static final long serialVersionUID = -3000897897090466540L;
複製程式碼

3. 方法

lock 方法

//上鎖
final void lock() {
    		//呼叫AbstractQueuedSynchronizer的acquire方法
    		//先嚐試獲取鎖,失敗的話進入等待佇列
            acquire(1);
        }
複製程式碼

tryAcquire 方法

//嘗試獲取鎖的方法,重寫父類的方法
protected final boolean tryAcquire(int acquires) {
    		//獲取當前執行緒
            final Thread current = Thread.currentThread();
    		//獲取狀態值
            int c = getState();
            if (c == 0) {
                //c等於0,表示當前沒有執行緒持有鎖,但是可能是上一個執行緒剛好釋放鎖
                //既然是公平鎖,應該先檢查佇列前面有沒有等待的節點,有的話先讓前面的節點獲取鎖
                //沒有的話通過CAS修改state值來獲取鎖,並把持有鎖的執行緒設定為當前執行緒
                if (!hasQueuedPredecessors() &&
                    compareAndSetState(0, acquires)) {
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
    		//如果當前執行緒已經獲取了鎖,表示重入鎖
    		//這裡只需要把state值加1即可
            else if (current == getExclusiveOwnerThread()) {
                int nextc = c + acquires;
                if (nextc < 0)
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
    		//沒獲取到鎖返回false
            return false;
        }
複製程式碼

相關文章