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() 獲取等待在同步隊列上的線程集合
同步器提供的模板分爲三大類: ide