Java 併發程式設計(十) -- ReentrantLock中的Sync

我很醜發表於2020-03-13

1. 類的定義

abstract static class Sync extends AbstractQueuedSynchronizer
複製程式碼

從類的定義中可以看出

  • Sync是一個抽象類
  • Sync繼承了AbstractQueuedSynchronizer類

2. 欄位屬性

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

3. 方法

lock 方法

//上鎖,抽象方法,讓子類實現
abstract void lock();
複製程式碼

nonfairTryAcquire 方法

//嘗試獲取不公平鎖
final boolean nonfairTryAcquire(int acquires) {
    		//獲取當前執行緒
            final Thread current = Thread.currentThread();
    		//獲取當前鎖的狀態
            int c = getState();
            if (c == 0) {
                //表示當前沒有執行緒獲取鎖
                //CAS方式獲取鎖
                if (compareAndSetState(0, acquires)) {
                    //獲取成功,把持有當前鎖的執行緒設定為當前執行緒
                    setExclusiveOwnerThread(current);
                    //返回true
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {
                //如果當前執行緒持有鎖,這裡表示重入鎖
                //修改狀態為獲取鎖的次數
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
    		//獲取鎖失敗返回false
            return false;
        }
複製程式碼

tryRelease 方法

//嘗試釋放鎖
protected final boolean tryRelease(int releases) {
    		//計算新的狀態值
            int c = getState() - releases;
    		//如果當前執行緒沒有持有當前鎖,丟擲異常
            if (Thread.currentThread() != getExclusiveOwnerThread())
                throw new IllegalMonitorStateException();
    		//是否完全釋放標誌
            boolean free = false;
            if (c == 0) {
                //狀態為0表示完全釋放
                //完全釋放標誌設定為true
                free = true;
                //把持有當前鎖的執行緒置為null
                setExclusiveOwnerThread(null);
            }
    		//重新設定鎖的狀態
            setState(c);
            return free;
        }
複製程式碼

isHeldExclusively 方法

//判斷持有鎖的是否為當前執行緒
protected final boolean isHeldExclusively() {
            return getExclusiveOwnerThread() == Thread.currentThread();
        }
複製程式碼

newCondition 方法

//獲取一個新的Condition物件
final ConditionObject newCondition() {
            return new ConditionObject();
        }
複製程式碼

getOwner 方法

//獲取持有當前鎖的執行緒
final Thread getOwner() {
            return getState() == 0 ? null : getExclusiveOwnerThread();
        }
複製程式碼

getHoldCount 方法

//獲取當前鎖被持有的次數
final int getHoldCount() {
            return isHeldExclusively() ? getState() : 0;
        }
複製程式碼

isLocked 方法

//判斷是否有執行緒持有當前鎖
final boolean isLocked() {
            return getState() != 0;
        }
複製程式碼

相關文章