Java中的AQS

Java中的AbstractQueuedSynchronizer(AQS)是Java并發框架的核心組件之一,它位于java.util.concurrent.locks包下。AQS為Java的鎖和其他同步工具提供了基礎架構,它使用模板設計模式和一種稱為“CLH鎖”的算法來實現高效的線程同步。

AQS的主要組成部分

AQS的主要功能圍繞著一個volatile整型成員變量state和一個FIFO線程等待隊列來組織。state變量用于表示同步狀態,比如鎖是否被持有,有多少線程正在持有鎖等。這個狀態變量是通過原子更新的方式來保證線程安全性。

CLH鎖算法

AQS使用CLH鎖算法(Craig, Landin, and Hagersten)來管理線程間的同步。CLH鎖算法的特點是使用了一個尾指針(tail pointer)來標識隊列的末端,新來的線程會將其自身添加到隊列的尾部,并且將自己設置為隊列的新的尾節點。當線程從等待隊列中被喚醒時,它會檢查前一個節點的狀態,以確定是否可以嘗試獲取鎖。

AQS的關鍵方法

AQS提供了一些關鍵的方法,它們被子類重寫以適應特定的同步需求:

  • isHeldExclusively():判斷當前同步狀態是否是獨占模式。
  • tryAcquire(int)?和?tryRelease(int):嘗試獲取和釋放同步狀態,這兩個方法由子類實現,用于具體的操作。
  • tryAcquireShared(int)?和?tryReleaseShared(int):嘗試獲取和釋放共享模式下的同步狀態。
  • acquire(int)?和?acquireShared(int):如果無法立即獲取同步狀態,這些方法會將當前線程放入等待隊列并阻塞當前線程。
  • release(int)?和?releaseShared(int):釋放同步狀態,如果這是最后一個持有同步狀態的線程,它會喚醒等待隊列中的下一個線程。

AQS的子類

AQS的子類包括但不限于:

  • ReentrantLock:可重入的互斥鎖。
  • Semaphore:信號量,用于控制對有限數量資源的訪問。
  • CountDownLatch:倒計時門閂,用于等待一組操作完成。
  • CyclicBarrier:循環柵欄,用于等待固定數量的線程到達某個點。
  • ReadWriteLock:讀寫鎖,允許多個讀線程同時訪問資源,但不允許讀線程和寫線程或者兩個寫線程同時訪問。

AQS的工作流程

當線程試圖獲取同步狀態時,AQS會調用tryAcquiretryAcquireShared方法。如果同步狀態無法立即獲取,線程會被插入到等待隊列中,并且線程會被阻塞。當同步狀態被釋放時,AQS會喚醒等待隊列中的一個或多個線程,使其有機會再次嘗試獲取同步狀態。

總結

AQS是Java并發包中的一個高度抽象和靈活的工具,它通過模板方法和鉤子函數(hook methods)的設計模式,為開發者提供了構建各種同步組件的基礎。通過重寫AQS提供的方法,開發者可以輕松地實現自定義的同步邏輯,而不需要關心線程調度和同步狀態的底層細節。AQS的使用,大大簡化了Java中并發控制組件的開發和維護。

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

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

相關文章

如何使用 SwiftUI 構建 visionOS 應用

文章目錄 前言WindowsVolumes沉浸式空間結論 前言 Apple Vision Pro 即將推出,現在是看看 SwiftUI API 的完美時機,這使我們能夠將我們的應用程序適應 visionOS 提供的沉浸式世界。蘋果表示,構建應用程序的最佳方式是使用 Swift 和 SwiftUI。…

2024年軟件測試崗必問的100+個面試題【含答案】

一、基礎理論 1、開場介紹 介紹要領:個人基本信息、工作經歷、之前所做過的工作及個人專長或者技能優勢。揚長避短,一定要口語化,語速適中。溝通好的就多說幾句,溝通不好的話就盡量少說兩句。舉例如下: 面試官你好&…

Java中Predicate(謂詞),方法引用,以及正則的一些講解

1.Predicate接口簡述 FunctionalInterface public interface Predicate<T> {boolean test(T t);default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);}default Pred…

速盾:cdn加速效果

CDN&#xff08;Content Delivery Network&#xff09;即內容分發網絡&#xff0c;是一種通過在全球多個節點服務器上緩存網站的靜態資源&#xff0c;并將用戶請求導向離用戶最近的服務器節點&#xff0c;從而提供更快速的訪問體驗的技術。 在傳統的網絡架構中&#xff0c;用戶…

鴻蒙 HarmonyOs 網絡請求 快速入門

官方文檔&#xff1a; ArkUI簡介-ArkUI&#xff08;方舟UI框架&#xff09;-應用框架 | 華為開發者聯盟 (huawei.com) 一、通過原有的http組件進行網絡請求&#xff08;方式一&#xff09; 1.1 HttpRequestOptions的操作 名稱類型描述methodRequestMethod請求方式&#xff…

12款超良心好用APP推薦,每一款都值得下載!

AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻https://aitools.jurilu.com/分享是奉獻的果實&#xff0c;分享是快樂的前提。每天給小伙伴們分享自己認可的軟件&#xff0c;也是莫大的幸福&#xff0c;今天獲得12款好用的軟…

class類和style內聯樣式的綁定

這里的綁定其實就是v-bind的綁定&#xff0c;如代碼所示&#xff0c;div后面的引號就是v-bind綁定&#xff0c;然后大括號將整個對象括起來&#xff0c;對象內先是屬性&#xff0c;屬性后接的是變量&#xff0c;這個變量是定義在script中的&#xff0c;后通過這個變量&#xff…

flutter:監聽路由的變化

問題 當從路由B頁面返回路由A頁面后&#xff0c;A頁面需要進行數據刷新。因此需要監聽路由變化 解決 使用RouteObserver進行錄音監聽 創建全局變量&#xff0c;不在任何類中 final RouteObserver<PageRoute> routeObserver RouteObserver<PageRoute>();在mai…

flask-apscheduler 定時任務被執行兩次

定時任務沒有被多次調用&#xff0c;事實上如果多次調用的話&#xff0c;flask-apscheduler會拋出異常。 但一開始任務還是按時執行一次&#xff0c;重啟flask或者修改部分代碼后&#xff0c;就發送定時任務一次執行兩次了。 之所以會發生這種情況&#xff0c;是因為在debug模…

面試-微服務篇

springcloud組件有哪些&#xff1f; eureka、ribbon負載均衡、feign、hystrix、zuul/gateway網關 nacos、ribbon、feign、sentinel、gateway 服務注冊和發現是什么意思&#xff1f;springcloud如何實現服務注冊發現&#xff1f; 微服務中必須要使用的組件&#xff0c;考察我們使…

LeetCode刷題記錄:(15)三角形最小路徑和

知識點&#xff1a;倒敘的動態規劃 題目傳送 解法一&#xff1a;二維動態規劃【容易理解】 class Solution {public int minimumTotal(List<List<Integer>> triangle) {int n triangle.size();if (n 1) {return triangle.get(0).get(0);}// dp[i][j]:走到第i層第…

[240705] 美光或將助力英偉達 RTX 50系列領先 AMD | 中國領跑生成式人工智能專利競賽

目錄 美光或將助力英偉達 RTX 50系列領先 AMD中國領跑生成式人工智能專利競賽 美光或將助力英偉達 RTX 50系列領先 AMD &#x1f4e2; 美光近日公布了其下一代顯存 GDDR7 的性能數據&#xff0c;顯示出在游戲性能方面高達30%的提升&#xff0c;這對于即將推出的顯卡來說無疑是…

白騎士的C語言教學基礎篇 1.2 C語言基礎語法

系列目錄 上一篇&#xff1a;白騎士的C語言教學基礎篇 1.1 C語言介紹 在這一篇內容中&#xff0c;我們將介紹C語言的基礎語法&#xff0c;包括C語言的程序結構、數據類型與變量、常量與運算符。 C語言程序結構 C語言程序的基本結構包括頭文件、主函數和語句。一個簡單的C語言…

Java+前后端分離架構+ MySQL8.0.36產科信息管理系統 產科電子病歷系統源碼

Java前后端分離架構 MySQL8.0.36產科信息管理系統 產科電子病歷系統源碼 產科信息管理系統—住院管理 數字化產科住院管理是現代醫院管理中的重要組成部分&#xff0c;它利用數字化技術優化住院流程&#xff0c;提升醫療服務質量和效率。以下是對數字化產科住院管理的詳細闡述…

【Spring Boot】統一異常處理

目錄 統一異常處理一. 概念二. 全局異常處理三. 處理特定異常 統一異常處理 一. 概念 其實統一異常是運用了AOP&#xff08;對某一類事情的集中處理&#xff09;的思維&#xff0c;簡單概括就是在我們進行前后端數據交互的時候&#xff0c;拋出的任何的異常都能夠自動捕獲然后…

uniapp微信接口回調 response.sendRedirect nginx 報404錯誤

如題 參考 uniapp打包H5時,訪問index.html頁面白屏報錯net::ERR_ABORTED 404 - 簡書 nginx中修改 配置文件 location / { try_files $uri $uri/ /index.html; root html; index index.html index.htm; } uniapp里配置 重新載入

JavaScript常用包管理工具

NPM、Yarn、CNPM 和 PNPM 是 JavaScript 生態系統中常用的包管理工具。它們各自有不同的特點和優勢。以下是對它們的詳細解釋&#xff1a; 1. NPM (Node Package Manager) 簡介&#xff1a; NPM 是 Node.js 的默認包管理工具&#xff0c;也是最早出現的 JavaScript 包管理工具…

ingress-nginx控制器證書不會自動更新問題

好久沒更新了&#xff0c;正好今天遇到了一個很有意思的問題&#xff0c;在這里給大家分享下&#xff0c;同時也做下記錄。 背景 最近想做個實驗&#xff0c;當k8s集群中secret更新后&#xff0c;ingress-nginx控制器會不會自動加載新的證書。我用通義千問搜了下&#xff0c;…

什么是FPGA的基本組成單元?

FPGA&#xff08;Field-Programmable Gate Array&#xff09;的基本組成單元是其內部結構的關鍵組件&#xff0c;這些單元可以被編程來執行各種數字邏輯功能。FPGA的基本組成單元主要包括以下幾個部分&#xff1a; 可編程邏輯塊 (CLB, Configurable Logic Block) CLB是FPGA中最…

Airflow: 大數據調度工具詳解

歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;歡迎訂閱相關專欄&#xff1a; 歡迎關注微信公眾號&#xff1a;野老雜談 ?? 全網最全IT互聯網公司面試寶典&#xff1a;收集整理全網各大IT互聯網公司技術、項目、HR面試真題. ?? AIGC時代的創新與未來&a…