AQS底層實現原理

前置知識:

①公平鎖和非公平鎖

②可重入鎖

③LockSupport

④自旋鎖

⑤數據結構之鏈表

⑥設計模式之模板設計模式

前言

字面意思:抽象的隊列同步器

技術翻譯:是用來構建鎖或者其它同步器組件的重量級基礎框架及整個JUC體系的基石, 通過內置的FIFO隊列來完成資源獲取線程的排隊工作,並通過一個int類變量表示持有鎖的狀態。

AQS是JUC內容中最重要的基石,涵蓋內容:ReentrantLock、ReentrantReadWriteLock、CountdownLatch、CyclicBarrier、Semaphore。

解釋說明:

        搶到資源的線程直接使用辦理業務,搶佔不到資源的線程的必然涉及一種排隊等候機制,搶佔資源失敗的線程繼續去等待(類似辦理窗口都滿了,暫時沒有受理窗口的顧客只能去候客區排隊等候),仍然保留獲取鎖的可能且獲取鎖流程仍在繼續(候客區的顧客也在等着叫號,輪到了再去受理窗口辦理業務)。
 
        既然說到了排隊等候機制,那麼就一定會有某種隊列形成,這樣的隊列是什麼數據結構呢?
 
        如果共享資源被佔用,就需要一定的阻塞等待喚醒機制來保證鎖分配。這個機制主要用的是CLH隊列的變體實現的,將暫時獲取不到鎖的線程加入到隊列中,這個隊列就是AQS的抽象表現。它將請求共享資源的線程封裝成隊列的結點(Node) ,通過CAS、自旋以及LockSuport.park()的方式,維護state變量的狀態,使併發達到同步的效果。

ReentrantLock原理

需要隊列

         AQS使用一個volatile的int類型的成員變量來表示同步狀態,通過內置的 FIFO隊列來完成資源獲取的排隊工作將每條要去搶佔資源的線程封裝成 一個Node節點來實現鎖的分配,通過CAS完成對State值的修改。

AQS源碼解讀案例圖示

擴展

1、AQS裏面有個變量叫State,它的值有幾種?

     3個狀態:沒佔用是0,佔用了是1,大於1是可重入鎖。

2、如果AB兩個線程進來了以後,請問這個總共有多少個Node節點?

    3個,除了A和B兩個線程Node節點外,還包括首節點的哨兵節點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章