1. 程式人生 > >J.U.C之AQS介紹

J.U.C之AQS介紹

抽象 行操作 boolean queue 共享 狀態 final 組件 strong

AQS簡單介紹:

     AQS(AbstractQueuedSynchronizer)即隊列同步器。它是構建鎖或者其他同步組件的基礎框架(如ReentrantLock ,ReentrantReadWriteLock,Semaphore 等),JUC並發包的作者期望它能夠成為實現大部分同步需求的基礎。它是JUC並發包中的核心基礎組件。
    隊列同步器AbstractQueuedSynchronizer(一下簡稱同步器),是用來構建鎖或者其他同步組見的基礎框架,它使用了一個<font color=red>int成員變量</font>表示同步狀態,通過內置的FIFO隊列完成資源獲取線程的排隊工作。

同步器的主要使用方式
繼承,子類通過繼承同步器並實現它的抽象方法來管理同步狀態,在抽象方法的實現過程中免不了要對同步狀態進行更改。這時需要使用同步器提供的3個方法:<font color=red>getState(),setState()和compareAndSetState(int expect,int update )</font>來進行操作,因為它們能夠保證狀態的改變是安全的.

隊列同步器的接口

    同步器的設計基於模板方法模式的,也就是說,使用者需要繼承同步器並重寫指定的方法,隨後將同步器組合在自定義同步組件的實現中,並調用同步器提供的模板方法,而這些模板方法將會調用使用者重寫的方法。

同步器可重寫的方法:

  • protected boolean tryAcquire(int arg) :獨占式獲取同步狀態,實現該方法需要查詢當前狀態並判斷同步狀態是否符合預期,然後再進行CAS設置同步狀態。
  • protected Boolean tryRelease(int arg) :獨占式釋放同步狀態,等待獲取同步狀態的線程將有機會獲取同步狀態
  • protected int tryAcquireShared(int arg) 共享式獲取同步狀態,返回大於等於0的值,表示獲取成功,反之獲取失敗
  • protected boolean tryReleaseShared(int arg) 共享式釋放同步狀態
  • protected boolean isHeldExclusively() 當前同步是否在獨占模式下被線程占用,一般方法表示是否別當前線程獨占。

    同步器提供的模板方法

  • public final void acquire(int arg) 獨占式獲取同步狀態,如果當前線程獲取同步狀態成功,則由該方法返回,否則,將會進入同步隊列等待,該方法將會調用重寫的tryAcquire(int arg)方法
  • public final void acquireInterruptibly(int arg) 與acquire(int arg)相同,但是該方法響應中斷,當前線程未獲取到同步狀態而進入同步隊列中,如果當前線程被中斷,則該方法會拋出InterruptedException並返回。
  • public final boolean tryAcquireNanos(int arg, long nanosTimeout) 在acquireInterruptibly(int arg)基礎上增加了超時限制,如果當前線程在超過時間內沒有獲取到同步狀態,那麽將返回false,如果獲取到了返回true
  • public final boolean release(int arg)  獨占式的釋放同步狀態,該方法會在釋放同步狀態之後,將同步隊列中第一個節點包含的線程喚醒。
  • public final void acquireShared(int arg) 共享式的獲取同步狀態,如果當前線程未獲取到同步狀態,將會進入同步隊列等待,與獨占式獲取的主要區別是在同一時刻可以有多個線程獲取到同步狀態
  • public final void acquireSharedInterruptibly(int arg) 與acquireShared(int arg)相同,該方法響應中斷
  • public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout) 在acquireSharedInterruptibly(int arg)基礎上增加了超時限制
  • public final boolean releaseShared(int arg) 共享式的釋放同步狀態
  • public final Collection<Thread> getQueuedThreads() 獲取等待在同步隊列上的線程集合

同步器提供的模板分為三大類:

  1. 獨占式獲取與釋放同步狀態
  2. 共享式獲取與釋放同步狀態
  3. 查詢同步隊列中的等待線程情況

J.U.C之AQS介紹