AQS面試題


問:什么是AQS?

答:AQS的全稱為(AbstractQueuedSynchronizer),這個類在java.util.concurrent.locks包下面。AQS是一個用來構建鎖和同步器的框架,比如ReentrantLock,Semaphore,ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基於AQS的。

問:AQS的核心思想是什么?它是怎么實現的?

答:AQS核心思想是,如果被請求的共享資源空閑,則將當前請求資源的線程設置為有效的工作線程,並且將共享資源設置為鎖定狀態。如果被請求的共享資源被占用,那么就需要一套線程阻塞等待以及被喚醒時鎖分配的機制,這個機制AQS是用CLH隊列鎖實現的,即將暫時獲取不到鎖的線程加入到隊列中。 AQS使用一個voliate int成員變量來表示同步狀態,通過內置的FIFO隊列來完成獲取資源線程的排隊工作。AQS使用CAS對該同步狀態進行原子操作實現對其值的修改。

AQS定義了兩種資源獲取方式:獨占(只有一個線程能訪問執行,又根據是否按隊列的順序分為公平鎖和非公平鎖,如ReentrantLock) 和共享(多個線程可同時訪問執行,如Semaphore/CountDownLatch,Semaphore、CountDownLatCh、 CyclicBarrier )。ReentrantReadWriteLock 可以看成是組合式,允許多個線程同時對某一資源進行讀。

AQS底層使用了模板方法模式, 自定義同步器在實現時只需要實現共享資源 state 的獲取與釋放方式即可,至於具體線程等待隊列的維護(如獲取資源失敗入隊/喚醒出隊等),AQS已經在上層已經幫我們實現好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM