【Java面試】請談談AQS是怎麼回事兒?

跟著Mic學架構發表於2022-07-13

Hi,大家好,我是Mic。

今年的市場環境是真的很難。很多工作一年的人,面試的難度相當於一個4年經驗的人。

image-20220518212100187

越是這樣,我們越應該強大自己,才能在逆境中獲得更多的機會。

今天一個一年經驗的粉絲,被問到“AQS的實現原理”,來找我求助。

下面看看高手對於這個問題的回答。

喜歡我作品的小夥伴,記得點贊收藏加關注。

高手:

AQS它是J.U.C這個包裡面非常核心的一個抽象類,它為多執行緒訪問共享資源提供了一個佇列同步器。

在J.U.C這個包裡面,很多元件都依賴AQS實現執行緒的同步和喚醒,比如Lock、Semaphore、CountDownLatch等等。

AQS內部由兩個核心部分組成:

  • 一個volatile修飾的state變數,作為一個競態條件
  • 用雙向連結串列結構維護的FIFO執行緒等待佇列

它的具體工作原理是,多個執行緒通過對這個state共享變數進行修改來實現競態條件,

競爭失敗的執行緒加入到FIFO佇列並且阻塞,

搶佔到競態資源的執行緒釋放之後,後續的執行緒按照FIFO順序實現有序喚醒。

image-20220519130818819

AQS裡面提供了兩種資源共享方式,

一種是獨佔資源,同一個時刻只能有一個執行緒獲得競態資源。比如ReentrantLock就是使用這種方式實現排他鎖

另一種是共享資源,同一個時刻,多個執行緒可以同時獲得競態資源。CountDownLatch或者Semaphore就是使用共享資源的方式,實現同時喚醒多個執行緒。

總結

在實際開發中,如果我們需要實現一些特殊的互斥場景,

直接使用ReentrantLock又有點麻煩,那就可以自己去整合AQS,自定義多執行緒競爭的實現邏輯。

這個問題主要考察求職責對Java基礎的理解。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!

相關文章