隊列同步器AbstractQueuedSynchronizer(如下簡稱AQS)是用來構建鎖或者其餘同步組件的基礎框架,它使用了一個int成員變量state來表示同步狀態,經過內置一個FIFO隊列來完成資源獲取線程的排隊工做。併發包的做者(Doug Lea)指望它可以實現大部分同步需求的基礎。它是JUC併發包中的核心基礎組件。面試
同步器AbstractQueuedSynchronizer是一個抽象類,所以同步器的主要使用方式是繼承。子類經過繼承同步器並實現它的抽象方法來管理同步狀態。在抽象方法的實現過程當中,免不要對同步器的狀態進行更新,所以同步器中提供了3個設置和修改同步狀態的方法,它們分別是:併發
- getState(): 獲取當前同步器的狀態。
- setState(int newState): 設置當前同步器的狀態
- compareAndSetState(int expect, int update): 原子性的更新當前同步器的狀態。若是當前同步器的狀態值和指望值(expect)相等,則將同步器的狀態值更新爲update的值,不然不更新當前同步器狀態值。
子類推薦被定義爲自定義同步器的靜態內部類,同步器自身沒有實現任何同步接口,它僅僅是定義了若干同步狀態的獲取和釋放的方法來供自定義同步組件的只用。同步器便可以支持獨佔模式獲取同步器狀態,也支持共享模式獲取同步器狀態,這樣就能夠實現不一樣類型的同步器組件(ReentrantLock、ReentrantReadWriteLock、Semaphore和CountDownLatch等)。同步器隱藏了大量的實現細節,簡化了鎖的實現方法,屏蔽了同步狀態的管理,線程的排隊、等待與喚醒等底層操做。框架
同步器主要提供瞭如下方法:ui
- getState():獲取當前同步器狀態
- setState(int newState):設置當前同步器狀態
- compareAndSetState(int expect, int update):使用CAS設置當前同步器狀態,該方法可以保證設置狀態的原子性。
- tryAcquire(int arg):獨佔式獲取同步狀態,實現該方法須要查詢當前同步器狀態並判斷同步器狀態是否符合預期值,而後在進行CAS設置同步狀態。
- tryRelease(int arg):獨佔式釋放同步狀態,等待獲取同步狀態的線程將有機會獲取同步狀態。
- tryAcquireShared(int arg):共享式獲取同步狀態,返回的值大於等於0,則表示獲取成功,反之獲取失敗。
- tryReleaseShared(int arg):共享式釋放同步狀態。
- isHeldExclusively():同步器是否在獨佔模式下被線程佔用,通常改方法表示是否被當前線程獨佔。
- acquire(int arg):獨佔模式獲取同步狀態,忽略中斷。若是當前線程獲取同步狀態成功,則由該方法返回,不然將進入同步隊列等待,該方法將會調用重寫的的tryAcquire(int arg)方法。
- acquireInterruptibly(int arg):獨佔式獲取同步狀態,可是該方法響應中斷。當前線程未獲取到同步狀態則進入同步隊列中,若是當前線程被中斷,則該方法會拋出InterruptedException並返回。
- tryAcquireNanos(int arg, long nanosTimeout):超時獲取同步狀態,若是當前線程在超時事件nanos內沒有獲取到同步狀態,則返回false,反之返回true.
- acquireShared(int arg):共享式獲取同步狀態,忽略響應中斷。若是當前線程未獲取到同步狀態,將會進入同步隊列中等待,與獨佔模式獲取同步狀態的主要區別在於同一時刻能夠有多個線程獲取到同步狀態。
- acquireSharedInterruptibly(int arg):與acquireShared(int arg)相同,區別在於該方法響應中斷。
- tryAcquireSharedNanos(int arg, long nanosTimeout):共享獲取同步狀態,增長超時限制。
- release(int arg):獨佔式的釋放同步狀態,該方法會在釋放同步狀態以後將同步隊列中第一個節點包含的線程喚醒。
- releaseShared(int arg):共享式的釋放同步狀態。
同步器提供的模板方法基本上分爲3類:獨佔式獲取與釋放同步狀態、共享式獲取與釋放狀態以及查詢同步隊列中等待線程的狀況。線程
只有掌握了同步器的工做原理才能更深刻的理解JUC(併發包)中的其它組件,下一章LZ將用一個簡單的例子來了解下同步器的工做原理。code
關注下面公衆號,回覆
1024
領取最新大廠面試資料繼承