日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AQS的细节--自用,非正常教程

發布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AQS的细节--自用,非正常教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AQS的概念

AQS叫抽象隊列同步器,是一個框架,我們可以在JUC很多包看見AQS的具體實現,比如鎖和讀寫鎖,condition等,具有可擴展性,可以根據此自定義同步工具類,優點是系統開銷低,實現鎖比較靈活,可擴展性強,滿足特殊需求。

AQS的核心思想

AQS核心思想是,如果被請求的共享資源空閑,那么就將當前請求資源的線程設置為有效的工作線程,將共享資源設置為鎖定狀態如果共享資源被占用,就需要一定的阻塞等待喚醒機制來保證鎖分配
這個機制主要用的是CLH隊列的變體實現的,將暫時獲取不到鎖的線程加入到隊列中。AQS使用一個Volatile修飾的int類型的成員變量(State)來表示同步狀態,通過內置的FIFO隊列來完成資源獲取的排隊工作,通過CAS完成對State值的修改。

AQS的數據結構

維護一個volatile修飾的int變量state,表示同步狀態;
有一個節點類,一個節點用來表示一個線程,節點里面有雙向指針,也有一個volatile修飾的int表示線程狀態(waitStatus);
還有一個同步隊列,說是隊列,實際上是一個雙向鏈表,邏輯上是隊列,只能有一個;
最后有一個條件隊列,它是一個單向鏈表,可以有多個。
Node節點數據結構:

·····················································································································

AQS同步狀態

AQS中維護了一個名為state的字段,意為同步狀態,是由Volatile修飾的,用于展示當前臨界資源的獲鎖情況。
對于我們自定義的同步工具,需要自定義獲取同步狀態和釋放狀態的方式,也就是自定義獲取state的值,和改變state值的方法。

AQS對各種鎖的實現

重入鎖實現原理

例如ReentrantLock中,state = 0,表示還沒有線程獲取鎖,state = 1,說明正在被使用,state > 1,表示被重入了,說明ReentrantLock自定義了state等于xxx的時候,各自代表了什么意思。

公平鎖與非公平鎖原理

記住一點,獲取鎖成功與否的標志是此線程是否成功用CAS改變了state,使其改成鎖被獲取的狀態(比如重入鎖中state=1為成功獲取鎖,那么如果有一個線程將state改成1,代表此線程成功獲取鎖),成功了就算獲取鎖。等到state變成0,這個時候誰會去獲取鎖便成了個問題,如果我們這樣設計:獲取鎖之前先判斷鎖是否被獲取,如果被獲取,此線程將乖乖排到隊尾,這樣就能實現公平鎖,因為避免了插隊的發生嘛;如果這樣設計:不作判斷直接CAS嘗試獲取鎖,競爭成功就插隊,這樣能實現非公平鎖,因為節點無視排序直接僭越想搶鎖,此為非公平嘛。

獨占模式實現原理

獨占和共享模式是通過修改State字段表示的同步狀態來實現的(比如state只能等于0,1,那就肯定是獨占鎖;如果state最大等于n,那么最多允許n個線程共享數據)
獨占模式顧名思義,只能一個線程使用鎖,加鎖過程是:如果加鎖失敗就進入隊列,加入隊列的時候,為了避免前面的線程是被中斷的,或者是發生異常的,那如果不處理這種線程,那這輩子此節點也獲取不了鎖,于是它利用pre指針訪問前驅節點判斷前驅節點的狀態,不對的就刪除,直到到達一個正常節點的背后;鎖釋放后,為了找到正常節點,也會將后繼異常節點清除直到找到合適的來喚醒

共享模式實現原理

顧名思義,鎖是可共享的,于是如果一個節點獲取了鎖,那么它將喚醒后續其他想獲取鎖的,節點狀態是共享的所有節點,直到碰到非共享狀態節點,解鎖也會喚醒后續線程。

其他應用場景

總結

以上是生活随笔為你收集整理的AQS的细节--自用,非正常教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。