AbstractQueuedSynchronizer之AQS

一、前置知識

????????公平鎖和非公平鎖:
????????公平鎖:鎖被釋放以后,先申請的線程先得到鎖。性能較差一些,因為公平鎖為了保證時間上的絕對順序,上下文切換更頻繁
????????非公平鎖:鎖被釋放以后,后申請的線程可能會先獲取到鎖,是隨機或者按照其他優先級排序的。性能更好,但可能會導致某些線程永遠無法獲取到鎖

????????可重入鎖:
????????也叫做遞歸鎖,指的是線程可以再次獲取自己的內部鎖,比如一個線程獲取到了對象鎖,此時這個對象鎖還沒有釋放,當其想再次獲取這個對象鎖的時候還是可以獲取的,如果不可重入的話,會導致死鎖。

????????
????????自旋思想:
????????當線程請求鎖時,如果鎖已經被其他線程持有,那么該線程會不斷地重試獲取鎖,而不是被掛起等待,這種不斷嘗試獲取鎖的行為稱為自旋

????????LockSupport:
????????一個工具類,用于線程的阻塞和喚醒操作,類似于wait()和notify()方法,但是更加靈活和可控提供了park()和unpark()兩個靜態方法用于線程阻塞和喚醒操作。優點在于可以在任意時刻阻塞和喚醒線程而不需要事先獲取鎖或監視器對象。

????????數據結構之雙向鏈表:
????????雙向鏈表(Doubly Linked List)是一種常見的數據結構,它是由一系列結點(Node)組成的,每個結點包含三個部分:數據域、前驅指針和后繼指針。其中,數據域存儲結點的數據,前驅指針指向前一個結點,后繼指針指向后一個結點。通過這種方式,雙向鏈表可以實現雙向遍歷和插入、刪除操作。

????????設計模式之模板設計模式:
????????模板設計模式是一種行為型設計模式,定義了一種算法的框架,并將某些步驟延遲到子類中事先,這種設計模式的主要目的是允許子類在不改變算法結構的情況下重新定義算法中的某些步驟。
????????優點是能夠提高代碼復用性和可維護性。

二、AQS入門級別理論知識

? ? ? ? 1、是什么?

? ? ? ? 字面意思:抽象的隊列同步器
? ? ? ? 通常的AbstractQueuedSynchronizer 簡稱為 AQS。

????????技術解釋:
????????是用來實現鎖或者其他同步器組件的公共基礎部分的抽象實現
????????是重量級基礎框架及整個JUC體系的基石,只要用于解決鎖分配給”誰“的問題。
????????整體就是一個抽象的FIFO隊列來完成資源獲取線程的排隊工作,并通過一個int類變量表示持有鎖的狀態

? ? ? ? 2、AQS為什么是JUC內容中最重要的基石

????????和AQS有關的:

????????ReentrantLock:

????????CountDownLatch:

????????ReentrantReadWriteLock:

????????Semaphore:

????????進一步理解鎖和同步器的關系:
????????鎖,面向鎖的使用者:定義了程序員和鎖交互的使用層API,隱藏了實現細節,你調用即可同步器,面向鎖的實現者。
????????Java并發大神DoungLee,提出了統一規范并簡化了鎖的實現,將其抽象出來,屏蔽了同步狀態管理、同步隊列的管理和維護、阻塞線程排隊和通知、喚醒機制等,是一切鎖和同步組件實現的----公共基礎部分

? ? ? ? 3、能干嘛?

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

? ? ? ? 4、小總結

????????AQS同步隊列的基本結構:

????????內部類Node(Node類在AQS類內部)
????????Node的int變量
????????Node的等待狀態waitState成員變量:volatile int waitStatus;
????????等候區其它顧客(其它線程)的等待狀態。隊列中每個排隊的個體就是一個Node

????????Node此類的講解:

三、AQS源碼分析前置知識儲備

? ? ? ? 1、AQS內部體系架構圖

? ? ? ? 2、AQS內部體系架構----AQS自身

????????AQS的int類型變量state:
????????
AQS的同步狀態State成員變量
? ? ? ?

????????

????????銀行辦理業務的受理窗口狀態:
????????零就是沒人,自由狀態可以去辦理
????????大于等于1,有人占用窗口,等著去

????????AQS的CLH隊列:
????????
CLH(三個大牛的名字組成)隊列為一個雙向隊列

????????銀行候客區的等待顧客

? ? ? ? 小總結:
????????有阻塞就需要排隊,實現排隊必然需要隊列
????????State變量+CLH雙端隊列

? ? ? ? 3、AQS內部體系架構----內部類Node

????????Node的int變量:
????????Node的等待狀態waitState成員變量
????????

    ????????說人話:
    ????????等候區其他顧客(其他線程)的等待狀態
    ????????隊列中每個排隊的個體就是一個Node

    ????????Node此類的講解:
    ????????內部結構:


    ????????

    ????????屬性說明:

    四、AQS源碼深度講解和分析

    ? ? ? ? 1、ReentrantLock的原理

    ????????Lock接口的實現類,基本都是通過聚合了一個隊列同步器的子類完成線程訪問控制的

    ? ? ? ? 2、從最簡單的lock方法開始看看公平和非公平


    公平鎖和非公平鎖的lock()方法唯一的區別就在于公平鎖在獲取同步狀態時多了一個限制條件:hasQueuedPredecessors()-----公平鎖加鎖時判斷等待隊列中是否存在有效節點的方法

    ? ? ? ? 3、以非公平鎖ReentrantLock()為例作為突破走起---方法lock()

    ????????對比公平鎖和非公平鎖的tryAcquire()方法的實現代碼,其實差異就在于非公平鎖獲取鎖時比公平鎖中少了一個判斷!hasQueuedPredecessors(),hasQueuedPredecessors()中判斷了是否需要排隊,導致公平鎖和非公平鎖的差異如下:
    ????????公平鎖:公平鎖講究先來后到,線程在獲取鎖時,如果這個鎖的等待隊列中已經有線程在等待,那么當前線程就會進入到等待隊列中;
    ????????非公平鎖:不管是否有等待隊列,如果可以獲取到鎖,則立刻占有鎖對象。也就是說隊列的第一個排隊線程蘇醒后,不一定就是排頭的這個線程獲得鎖,它還需要參加競爭鎖(存在線程競爭的情況下),后來的線程可能不講武德插隊奪鎖了。

    ????????正式開始源碼解讀:
    ????????
    lock():

    ? ? ??

    ????????acquire():

    ????????tryAcquire(arg):
    ???????
    ?return false:繼續推進條件,走下一個方法
    ????????return true:結束

    ????????addwaiter(Node.EXCLUSIVE):

    ????????注意:在雙向鏈表中,第一個節點為虛節點(也叫做哨兵節點),其實不存儲任何信息,只是占位。真正的第一個有數據的節點,是從第二個節點開始的
    ????????假如此時有線程C進入:

    ????????acquireQueued(addWeiter(Node.EXCLUSIVE), arg)-----坐穩隊列:

    ????????

    ? ? ? ? 4、unlock()

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/web/79650.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/web/79650.shtml
    英文地址,請注明出處:http://en.pswp.cn/web/79650.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    內存泄漏系列專題分析之十一:高通相機CamX ION/dmabuf內存管理機制Camx ImageBuffer原理

    【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了:內存泄漏系列專題分析之八:高通相機CamX內存泄漏&內存占用分析--通用ION(dmabuf)內存拆解 這一篇我們開始講: 內存泄漏系列專題分析之十一:高通相機CamX ION/dmabuf內存管理機制Camx ImageBuf…

    《類和對象(下)》

    引言: 書接上回,如果說類和對象(上)是入門階段,類和對象(中)是中間階段,那么這次的類和對象(下)就可以當做類和對象的補充及收尾。 一:再探構造…

    Java MVC

    在軟件開發中,MVC(Model-View-Controller)是一種常用的設計模式,它將應用程序分為三個核心部分:模型(Model)、視圖(View)和控制器(Controller)。這…

    嵌入式學習筆記 - 關于單片機的位數

    通常我們經常說一個單片機是8位的,16位的,32位的,那么怎么判斷一款單片機的位數是多少位呢,判斷的依據是什么呢, 一 單片機的位數 單片機的位數是指單片機數據總線的寬度,也就是一次能處理的數據的位數&a…

    推薦幾個常用免費的文本轉語音工具

    推薦幾個常用免費的文本轉語音工具 在數字內容創作的時代,文本轉語音(TTS)技術已經成為內容創作者的得力助手。無論是制作視頻配音、有聲讀物、還是為網站增加語音功能,這些工具都能大幅提高創作效率。今天,我將為大家推薦幾款優質的免費文本…

    Microsoft Azure DevOps針對Angular項目創建build版本的yaml

    Azure DevOps針對Angular項目創建build版本的yaml,并通過變量控制相應job的執行與否。 注意事項:代碼前面的空格是通過Tab控制的而不是通過Space控制的。 yaml文件中包含一下內容: 1. 自動觸發build 通過指定code branch使提交到此代碼庫的…

    Python Day23 學習

    繼續SHAP圖繪制的學習 1. SHAP特征重要性條形圖 特征重要性條形圖(Feature Importance Bar Plot)是 SHAP 提供的一種全局解釋工具,用于展示模型中各個特征對預測結果的重要性。以下是詳細解釋: 圖的含義 - 橫軸:表示…

    .NET 8 + Angular WebSocket 高并發性能優化

    .NET 8 Angular WebSocket 高并發性能優化。 .NET 8 WebSocket 高并發性能優化 WebSocket 是一種全雙工通信協議,允許客戶端和服務端之間保持持久連接。在高并發場景下,優化 WebSocket 的性能至關重要。以下是針對 .NET 8 中 WebSocket 高并發性能優化…

    Ubuntu 22.04.5 LTS 基于 kubesphere 安裝 cube studio

    Ubuntu 22.04.5 LTS 基于 kubesphere 安裝 cube studio 前置條件 已經成功安裝 kubesphere v4.3.1 參考教程: https://github.com/data-infra/cube-studio/wiki/%E5%9C%A8-kubesphere-%E4%B8%8A%E6%90%AD%E5%BB%BA-cube-studio 1. 安裝基礎依賴 # ubuntu安裝基礎依賴 apt insta…

    centos 7 安裝 java 運行環境

    centos 7 安裝 java 運行環境 java -version java version "1.8.0_131" Java(TM) SE Runtime Environment (build 1.8.0_131-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)java -version java version "1.8.0_144" Java(TM) …

    Linux系統管理與編程20:Apache

    蘭生幽谷,不為莫服而不芳; 君子行義,不為莫知而止休。 做好網絡和yum配置,用前面dns規劃的www的IP進行。 #!/bin/bash #----------------------------------------------------------- # File Name: myWeb.sh # Version: 1.0 # …

    .NET 在鴻蒙系統上的適配現狀

    目錄 .NET 在鴻蒙系統上的適配現狀 鴻蒙系統對虛擬機的限制與.NET的適配挑戰 NativeAOT 在鴻蒙系統中的適配原理與實現方式 已知問題與解決方案:鴻蒙系統中的 syscall 限制 鴻蒙系統適配中的技術難點與解決方案 跨平臺編譯的挑戰與應對策略 依賴庫管理與兼容…

    kotlin JvmName注解的作用和用途

    1. JvmName 注解的作用 JvmName 是 Kotlin 提供的一個注解,用于在編譯為 Java 字節碼時自定義生成的類名或方法名。 作用對象: 文件級別(整個 .kt 文件)函數、屬性、類等成員 主要用途: 控制 Kotlin 編譯后生成的 JV…

    樹莓派4 yolo 11l.pt性能優化后的版本

    樹莓派4 使用 Picamera2 拍攝圖像,然后通過 YOLO11l.pt 進行目標檢測,并在實時視頻流中顯示結果。但當前的代碼在運行時可能會比較卡頓,主要原因包括: picam2.capture_array() 是一個較慢的操作;YOLO 推理可能耗時較長…

    Docker私有倉庫實戰:官方registry鏡像實戰應用

    抱歉抱歉,離職后反而更忙了,拖了好久,從4月拖到現在,在學習企業級方案Harbor之前,我們先學習下官方方案registry,話不多說,詳情見下文。 注意:下文省略了基本認證 TLS加密&#xff…

    MySQL 安全架構:從滲透測試到合規審計

    MySQL 安全架構:從滲透測試到合規審計 一、數據庫安全的時代挑戰與核心需求 在數據成為企業核心資產的今天,MySQL 面臨的安全威脅日益復雜。據統計,2024 年全球數據庫泄露事件中,關系型數據庫占比高達 68%,其中 MySQ…

    【基礎復習筆記】計算機視覺

    目錄 一、計算機視覺基礎 1. 卷積神經網絡原理 2. 目標檢測系列 二、算法與模型實現 1. 在PyTorch/TensorFlow中實現自定義損失函數或網絡層的步驟是什么? 2. 如何設計一個輕量級模型用于移動端的人臉識別? 3. 描述使用過的一種注意力機制&#…

    Django 項目的 models 目錄中,__init__.py 文件的作用

    在 Django 項目的models/init.py文件中,這些導入語句的主要作用是將各個模型類從不同的模塊中導入到models包的命名空間中。這樣做有以下幾個目的: 簡化導入路徑 當你需要在項目的其他地方使用這些模型時,可以直接從models包導入&#xff0c…

    實現一個簡單的 TCP 客戶端/服務器

    注意: TCP 三次握手建立連接建立連接后,TCP 提供全雙工的通信服務,也就是在同一個連接中,通信雙方 可以在同一時刻同時寫數據,相對的概念叫做半雙工,同一個連接的同一時刻,只能由一方來寫數據T…

    專業課復習筆記 9

    前言 學爽了。 為什么哈希函數的空間復雜度是 O(N) 我們實際使用的電話號碼的數目是 N &#xff0c;理論上至多有 R 個電話號碼&#xff0c;桶數組 bucket array 的容量是 M &#xff0c;滿足條件 N < M < < R N<M<<R N<M<<R&#xff0c;因為動…