【Java面試筆記:實戰】41、Java面試核心考點!AQS原理及應用生態全解析

在這里插入圖片描述

引言:AQS在Java并發體系中的核心地位

AQS(AbstractQueuedSynchronizer)作為Java并發包的底層基石,是理解ReentrantLock、Semaphore等同步工具的關鍵。

在Java架構師面試中,AQS的原理與應用是高頻考點,掌握其核心機制對理解JUC包和構建高并發系統至關重要。

本文將從原理、應用、源碼到Spring生態實踐進行全面解析,幫助讀者系統掌握這一核心技術。

一、AQS核心原理深度剖析

1.1 AQS的架構設計與核心組件

AQS是Java并發包中用于構建鎖和同步器的抽象框架,其設計包含三大核心組件:

1.1.1 三大核心組件詳解
組件名稱技術實現核心作用
狀態變量statevolatile int,通過CAS操作更新存儲同步狀態,不同場景含義不同(如鎖重入次數、信號量許可數等)
CLH等待隊列雙向鏈表,由Node節點組成管理等待線程的FIFO順序,實現線程阻塞與喚醒機制
模板方法抽象方法需子類實現定義同步邏輯接口(如tryAcquire、tryRelease等),實現模板方法模式
1.1.2 Node節點核心字段解析
static final class Node {// 節點狀態:CANCELLED(1)、SIGNAL(-1)、CONDITION(-2)、PROPAGATE(-3)volatile int waitStatus;// 前驅節點引用volatile Node prev;// 后繼節點引用volatile Node next;// 關聯的線程volatile Thread thread;// 條件隊列中的后繼節點Node nextWaiter;
}
1.1.3 CLH隊列結構示意圖

在這里插入圖片描述
CLH隊列關鍵特性說明

  1. 雙向鏈表結構
    • 每個節點包含 prevnext 指針
    • 頭節點(Head)的prev為null
    • 尾節點(Tail)的next為null
  2. 節點內部結構
    static final class Node {volatile int waitStatus;  // 等待狀態volatile Node prev;       // 前驅節點volatile Node next;       // 后繼節點volatile Thread thread;   // 關聯線程Node nextWaiter;          // 條件隊列鏈接
    }
    
  3. 等待狀態(waitStatus)
    • SIGNAL(-1):后繼節點需要喚醒
    • CANCELLED(1):線程已取消
    • CONDITION(-2):在條件隊列中
    • 0:初始狀態
  4. 隊列操作
    • 入隊:尾插法(CAS更新Tail)
      // AQS中的入隊代碼
      private Node addWaiter(Node mode) {Node node = new Node(Thread.currentThread(), mode);Node pred = tail;if (pred != null) {node.prev = pred;if (compareAndSetTail(pred, node)) {pred.next = node;return node;}}enq(node); // CAS失敗時自旋入隊return node;
      }
      
    • 出隊:頭節點釋放后喚醒后繼
      // 喚醒后繼節點
      private void unparkSuccessor(Node node) {int ws = node.waitStatus;if (ws < 0) compareAndSetWaitStatus(node, ws, 0);Node s = node.next;if (s == null || s.waitStatus > 0) {s = null;// 從尾向前查找有效節點for (Node t = tail; t != null && t != node; t = t.prev)if (t.waitStatus <= 0) s = t;}if (s != null) LockSupport.unpark(s.thread);
      }
      

1.2 AQS工作流程詳解(獨占模式)

1.2.1 核心執行流程

在這里插入圖片描述

1.2.2 關鍵機制解析
  1. CAS無鎖操作
    // AQS更新state的核心方法
    protected final boolean compareAndSetState(int expect, int update) {return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    }
    
    • 通過Unsafe類直接操作內存,確保原子性
    • stateOffset通過objectFieldOffset獲取字段偏移量
  2. 線程阻塞與喚醒
    • 阻塞:LockSupport.park(this)
    • 喚醒:LockSupport.unpark(thread)
    • 基于Unsafe的park/unpark,比Object.wait/notify更高效
  3. 隊列管理
    • 入隊:CAS尾插法,保證線程安全
    • 出隊:頭節點釋放后,將后繼節點設為新頭節點

二、AQS的同步模式與核心方法

2.1 獨占模式(Exclusive Mode)

2.1.1 核心特性
  • 同一時刻僅允許一個線程獲取資源
  • 典型實現:ReentrantLock、ReentrantReadWriteLock.WriteLock
  • 關鍵方法:
    • acquire(int arg):獲取資源,失敗則入隊等待
    • release(int arg):釋放資源,喚醒后繼節點
2.1.2 狀態流轉圖
tryAcquire成功
tryRelease成功
重入鎖
未獲取鎖
獲取鎖

2.2 共享模式(Shared Mode)

2.2.1 核心特性
  • 允許多個線程同時獲取資源
  • 典型實現:Semaphore、CountDownLatch、ReentrantReadWriteLock.ReadLock
  • 關鍵方法:
    • acquireShared(int arg):獲取共享資源,失敗入隊
    • releaseShared(int arg):釋放共享資源,可能喚醒后繼
2.2.2 狀態流轉圖

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

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

相關文章

碩士課題常用命令

ros常用命令&#xff1a; 1.環境變量刷新 source devel/setup.bash2.ROS_INFO的信息在終端顯示為亂碼或者問號&#xff0c;則在main函數中加入&#xff1a; setlocale(LC_ALL, "");3.刷新bashrc文件 source ~/.bashrcPX4 roslaunch px4 mavros_posix_sitl.launc…

2.6 激光雷達消息格式

新建終端&#xff0c;執行命令 roslaunch wpr_simulation wpb_simple.launch 在新建終端&#xff0c;執行命令 roslaunch wpr_simulation wpb_rviz.launch 顯示/Scan話題消息&#xff0c;后面的參數是noarr無數組&#xff0c;防止刷屏 rostopic echo /scan --noarr 參考官…

常見的網絡協議有哪些

1.應用層 1.1 HTTP/HTTPS 前端與服務器通信的基礎協議&#xff0c;用于傳輸 HTML、CSS、JS、圖片等資源。 1.2WebSocket&#xff08;如社交聊天、股票實時報價、視頻會議、在線教育等&#xff09; WebSocket協議建立在TCP協議之上&#xff0c;實現了瀏覽器與服務器之間的實時…

Prometheus + Grafana 監控 RabbitMQ 實踐指南

文章目錄 Prometheus Grafana 監控 RabbitMQ 實踐教程一、前言二、環境搭建2.1 環境準備2.2 安裝 Prometheus2.3 安裝 Grafana 三、集成 RabbitMQ Exporter3.1 下載 RabbitMQ Exporter3.2 解壓文件3.3 配置環境變量3.4 啟動 RabbitMQ Exporter3.6 驗證 Exporter 狀態 四、Prom…

Babylon.js場景加載器(Scene Loader)使用指南

在3D開發中&#xff0c;Babylon.js的場景加載器(Scene Loader)是加載各種3D模型格式的核心工具。本文將詳細介紹如何高效使用Scene Loader加載多種格式的3D模型文件。 一、基本概念與支持格式 要加載特定類型的文件&#xff0c;Babylon.js需要先注冊對應的文件類型插件。目前…

編程學習網站大全(C++/OpenCV/QT方向)—— 資源導航與深度評測

工欲善其事&#xff0c;必先利其器 本文系統整理了C、OpenCV、QT三大方向的優質學習網站&#xff0c;結合技術特點與平臺優勢&#xff0c;助你精準選擇學習資源&#xff0c;少走彎路&#xff01; 一、C 學習網站精選 &#x1f4da; 1. cppreference.com 權威性最高&#xff1a…

逆向入門(5)程序逆向篇-AD_CM#2

打開程序 常規注冊界面&#xff0c;打開OD&#xff0c;隨便找找就看到關鍵字了 沒有殼邏輯也挺簡單的 獲取輸入框&#xff0c;用5比較輸入內容的長度&#xff0c;小于則跳轉提示密碼長度不夠 否則就進入下一個流程&#xff0c;去獲取序列號&#xff0c;其實可以直接將jnz換…

OD 算法題 B卷【路燈照明II】

文章目錄 路燈照明II 路燈照明II 在一條筆直的公路上安裝了N個路燈&#xff0c;從位置0開始安裝&#xff0c;間距固定為100米&#xff1b;每個路燈都有自己的照明半徑&#xff0c;計算第一個路燈和最后一個路燈之間&#xff0c;無法照明的區間長度和&#xff1b; 輸入描述: 第…

JUC核心解析系列(四)——同步工具類 (Synchronizers)深度解析

在多線程開發中&#xff0c;死鎖、資源競爭、線程協調等問題如同暗礁&#xff0c;稍有不慎就會導致程序崩潰。而JUC同步工具類正是解決這些問題的瑞士軍刀&#xff01; 一、同步工具類核心價值&#xff1a;線程協作的藝術 在高并發系統中&#xff0c;線程協作是保證數據一致性…

板凳-------Mysql cookbook學習 (十--6)

第7章&#xff1a;排序查詢結果 7.0 引言 mysql> use cookbook Database changed mysql> select * from driver_log; ---------------------------------- | rec_id | name | trav_date | miles | ---------------------------------- | 1 | Ben | 2014-07-30 …

從入門到精通:C# 中 AutoMapper 的深度解析與實戰應用

在 C# 開發領域&#xff0c;尤其是企業級應用開發過程中&#xff0c;不同層次和模塊之間的數據傳遞與對象轉換是常見需求。例如&#xff0c;從數據庫讀取的實體類&#xff0c;在傳遞到前端時&#xff0c;往往需要轉換為更簡潔、安全的數據傳輸對象&#xff08;DTO&#xff09; …

【熱更新知識】學習一 Lua語法學習

1、注釋 1.1 單行注釋 --注釋內容 --單行注釋 print打印函數 1.2 多行注釋&#xff0c;三種方式 --[[注釋內容]] --[[注釋內容]]-- --[[注釋內容--]] --[[ 多行 注釋 ]]--[[ 第二種多行注釋 1 2 ]]----[[ 第三種 多行 注釋 --]] 2、簡單變量 2.1 聲明變量&#xff0c…

React 第三方狀態管理庫的比較與選擇

在現代前端開發中,狀態管理是一個重要的環節。選擇合適的狀態管理庫可以極大地提高項目的可維護性和開發效率。本文將對幾種流行的狀態管理庫進行比較,包括Valtio、XState、MobX、Recoil和Zustand,幫助開發者在實際項目中做出明智的選擇。 1. Valtio 1.1. 設計理念 Valti…

《Kafka 在實時消息系統中的高可用架構設計》

Kafka 在實時消息系統中的高可用架構設計 引言 在當今互聯網社交應用中&#xff0c;實時消息系統已成為核心基礎設施。以中性互聯網公司為例&#xff0c;其每天需要處理數十億條消息&#xff0c;涵蓋一對一聊天、群組互動、直播彈幕等多種場景。特別是在大型直播活動中&#…

SKUA-GOCAD入門教程-第八節 線的創建與編輯3

8.1.4根據面對象創建曲線 (1)從曲面生成曲線 從曲面邊界生成曲線您可以從選定的曲面邊界創建一條單段曲線。 1、選擇 Curve commands > New > Borders > One 打開從曲面的一條邊界創建曲線對話框。 圖1 在“Name名稱”框中,輸入要創建的曲線的名稱。

Unity編輯器-獲取Projectwindow中拖拽內容的路徑

參考 Unity Editor 實現給屬性面板上拖拽賦值資源路徑 API Event DragAndDrop 示例 Mono腳本 using UnityEngine; public class TestScene : MonoBehaviour {[SerializeField] string testName; }Editor腳本 重寫InspectorGUI&#xff0c;在該函數中通過Event的Type參數獲…

重要的城市(圖論 最短路)

分析 a ≠ b的從a到B的最短路&#xff0c;才有重要城市。 求出最短路&#xff0c;才能確定重要城市。 是多源最短路&#xff0c;n ≤ 200&#xff0c;可用Floyd。 若a到b&#xff0c;只有一條最短路&#xff0c;那么 a到b的路徑上的點&#xff08;除了a、b&#xff09;都是…

50種3D效果演示(OpenGL)

效果&#xff1a; 一、只需打開命令行&#xff08;Windows 可用 cmd&#xff09;&#xff0c;輸入&#xff1a; pip install PyQt5 PyOpenGL numpy二、用命令行進入保存 .py 文件的目錄&#xff0c;運行&#xff1a; python openGL_3d_demo.py三、建立python文件命名openGL_3…

Java大模型開發入門 (6/15):對話的靈魂 - 深入理解LangChain4j中的模型、提示和解析器

前言 在上一篇文章中&#xff0c;我們見證了AiService注解的驚人威力。僅僅通過定義一個Java接口&#xff0c;我們就實現了一個功能完備的AI聊天服務。這感覺就像魔法一樣&#xff01; 但作為專業的工程師&#xff0c;我們知道“任何足夠先進的技術&#xff0c;都與魔法無異”…

用Rust如何構建高性能爬蟲

習慣了使用Python來寫爬蟲&#xff0c;如果使用Rust需要有哪些考量&#xff1f; 根據我了解的Rust 在性能、資源效率和并發處理方面完勝 Python&#xff0c;但是 Python 在開發速度和生態成熟度上占優。所以說&#xff0c;具體用那種模式&#xff0c;結合你項目特點做個詳細的…