java.util.concurrent.locks.AbstractOwnableSynchronizer 抽象類 源碼

類圖:

java.util.concurrent.locks.AbstractOwnableSynchronizer 源碼:

package java.util.concurrent.locks;

public abstract class AbstractOwnableSynchronizer
    implements java.io.Serializable {

    private static final long serialVersionUID = 3737899427754241961L;//版本號

    //保護構造方法,使得只有同一個包或者繼承的子類才能夠調用
    protected AbstractOwnableSynchronizer() { }

    //獨佔線程(不參與序列化)
    private transient Thread exclusiveOwnerThread;

    //設置獨佔線程
    protected final void setExclusiveOwnerThread(Thread thread) {
        exclusiveOwnerThread = thread;
    }

    //獲得獨佔線程.若是從未設置,則返回 null
    protected final Thread getExclusiveOwnerThread() {
        return exclusiveOwnerThread;
    }
}

已知子類:html

    AbstractQueuedLongSynchronizerAbstractQueuedSynchronizerjava

    該抽象類的主要做用是:記錄當前佔用獨佔鎖(互斥鎖)的線程實例。api

 

    例如:ui

        在ReentrantLock 源碼中,ReentrantLock 中的 Sync 內部類繼承了AbstractQueuedSynchronizer。spa

        在非公平方式獲取鎖的實現中,若獲取鎖成功,就會執行:setExclusiveOwnerThread(current);.net

//沒有線程正在競爭該鎖
if (c == 0) {
   // 繼承至AbstractQueuedSynchronizer的方法
   if (compareAndSetState(0, acquires)) {//若state爲0則將state修改成acquires的值,狀態0表示鎖沒有被佔用
      //AbstractQueuedSynchronizer繼承至AbstractOwnableSynchronizer的方法
      setExclusiveOwnerThread(current);// 設置當前線程獨佔
      return true;// 成功
   }
}

        在試圖在共享模式下獲取共享鎖(讀取鎖)時,若是獲取讀取鎖成功,就會執行:setExclusiveOwnerThread(null);  釋放獨佔的鎖。 線程

相關文章
相關標籤/搜索