Hi,大家好,我是Mic。
今年的市場環境是真的很難。很多工作一年的人,面試的難度相當於一個4年經驗的人。
越是這樣,我們越應該強大自己,才能在逆境中獲得更多的機會。
今天一個一年經驗的粉絲,被問到“AQS的實現原理”,來找我求助。
下面看看高手對於這個問題的回答。
喜歡我作品的小夥伴,記得點贊收藏加關注。
高手:
AQS它是J.U.C這個包裡面非常核心的一個抽象類,它為多執行緒訪問共享資源提供了一個佇列同步器。
在J.U.C這個包裡面,很多元件都依賴AQS實現執行緒的同步和喚醒,比如Lock、Semaphore、CountDownLatch等等。
AQS內部由兩個核心部分組成:
- 一個volatile修飾的state變數,作為一個競態條件
- 用雙向連結串列結構維護的FIFO執行緒等待佇列
它的具體工作原理是,多個執行緒通過對這個state共享變數進行修改來實現競態條件,
競爭失敗的執行緒加入到FIFO佇列並且阻塞,
搶佔到競態資源的執行緒釋放之後,後續的執行緒按照FIFO順序實現有序喚醒。
AQS裡面提供了兩種資源共享方式,
一種是獨佔資源,同一個時刻只能有一個執行緒獲得競態資源。比如ReentrantLock就是使用這種方式實現排他鎖
另一種是共享資源,同一個時刻,多個執行緒可以同時獲得競態資源。CountDownLatch或者Semaphore就是使用共享資源的方式,實現同時喚醒多個執行緒。
總結
在實際開發中,如果我們需要實現一些特殊的互斥場景,
直接使用ReentrantLock又有點麻煩,那就可以自己去整合AQS,自定義多執行緒競爭的實現邏輯。
這個問題主要考察求職責對Java基礎的理解。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!