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;
}
複製程式碼