Java AQS學習

來源:互聯網
上載者:User

標籤:資源   實現   工作   構建   volatile   read   state   它的   and   

AQS 作用AQS簡介

AQS是AbstractQueuedSynchronizer的縮寫,AQS是用來構建鎖或者其他同步群組件的基礎架構(或者說是基礎工具類),它維護了一個volatile int state來表示同步狀態和一個FIFO隊列來完成資源擷取過程中阻塞排隊的工作,並發包作者(Doug Lea)期望它能成為實現大部分同步需求的基礎。

AQS的使用

AQS的主要使用方式是繼承,子類通過繼承AQS並實現它的抽象方法來管理同步狀態;子類推薦被定義為自訂同步群組件的靜態內部類。子類通過繼承同步器並實現AQS的抽象方法來管理同步狀態,同步器自身沒有實現任何同步介面,它僅僅是定義了若干同步狀態擷取和釋放的工具方法來供自訂同步群組件使用。AQS採用了CAS的方式保證了同步狀態的改變是安全執行緒的。state狀態訪問的三種方法:

  • getState()
  • setState()
  • compareAndSetState()

AQS定義兩種資源共用方式:Exclusive(獨佔,同一時刻只有一個線程能執行,如ReentrantLock)和Share(共用式,多個線程可同時進行訪問,如Semaphore/CountDownLatch)。

不同的自訂同步器爭用共用資源的方式也不同。自訂同步器在實現時需要實現共用資源state的擷取和釋放方式即可,至於具體實現等待隊列的維護(如擷取資源失敗入隊\喚醒隊列等),AQS在底層已經實現好了。自訂同步器實現時主要需要實現以下幾種方法:

  • isHeldExclusively():該線程是否正在獨佔資源。只有用到condition才需要去實現它。
  • tryAcquire(int):獨佔方式。嘗試擷取資源,成功則返回true,失敗則返回false。
  • tryRelease(int):獨佔方式。嘗試釋放資源,成功則返回true,失敗則返回false。
  • tryAcquireShared(int):共用方式。嘗試擷取資源。負數表示失敗;0表示成功,但沒有剩餘可用資源;正數表示成功,且有剩餘資源。
  • tryReleaseShared(int):共用方式。嘗試釋放資源,成功則返回true,失敗則返回false。

以ReentrantLock為例,state初始化為0,表示未鎖定狀態。A線程lock()時,會調用tryAcqure()獨佔該鎖並將state+1。以後,其他線程再tryAcquire()時就會失敗,直到A線程unlock()到state=0(即釋放鎖)為止,其他線程才有機會擷取該鎖。當然,釋放鎖之前,A線程自己是可以重複擷取此鎖的(state累加),這就是可重新進入的概念。但要注意,擷取多少次就要釋放多少次,這樣才能保證state是能回到0態的。

再以CountDownLatch為例,任務分為N個線程進行執行,state也初始化為N(注意N要與線程個數一致)。這N個子線程是並存執行的,每個子線程執行完後countDown()一次,state會CAS減1。等到所有子線程都執行完後(即state=0),會unpark()住調用線程主調用線程,然後主調用線程就會從await()函數中返回,繼續後餘動作。

一般來說,自訂同步器要麼是獨佔式,要麼是共用式,他們也只需要實現tryAcquire-tryRelease、tryAcquireShared-tryReleaseShared中的一種即可。但AQS也支援自訂同步器同時實現獨佔和共用兩種方式,如:ReentrantReadWriteLock。

同步器提供的模板方法基本上分為3類:獨佔式擷取與釋放同步狀態、共用式擷取與釋放同步狀態和查詢同步隊列中的等待線程情況。

Java AQS學習

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.