AQS(抽象隊列同步器)

什么是AQS?

????????AQS(AbstractQueuedSynchronizer)是Java中用于實現鎖和同步器的基礎框架。它是一個抽象類,提供了一種靈活且強大的方式來實現各種同步器,如ReentrantLock、Semaphore、CountDownLatch等

AQS實現原理?

1、資源共享:AQS 中定義了一個整型的 state 變量來表示同步狀態,該狀態可以被多個線程共享,根據該狀態的不同值來表示不同的狀態(比如鎖被占用或者可用)。

  • 等于0:表示當前同步狀態為空閑狀態,即沒有線程占用資源。
  • 大于0:通常表示當前同步狀態被一個線程所占用,且在信號量的應用中也可以表示可用資源數量。
  • 小于0:一般表示當前同步狀態已被某個線程占用,數值表示等待獲取資源的線程數量

2、模板方法:AQS 提供了 acquire() 和 release() 兩個模板方法,具體的同步器只需實現這兩個方法的邏輯即可。其中 acquire() 方法用于獲取資源,如果獲取不到則會將當前線程加入等待隊列;release() 方法用于釋放資源,并喚醒等待隊列中的其他線程。

3、等待隊列:AQS 使用一個雙向鏈表來維護等待線程的隊列,隊列中的線程按照先進先出的順序來獲取資源。當一個線程無法獲取資源時,會被加入到等待隊列中并進入等待狀態。

4、CAS 操作:AQS 使用 CAS(Compare And Swap)操作來對狀態進行原子性地修改,保證多線程并發操作時的數據一致性。

5、子類實現:具體的同步器(如 ReentrantLock、Semaphore 等)需要繼承 AQS,并根據自身需求實現 acquire() 和 release() 方法,來實現自定義的同步邏輯。

AQS的輔助類?

Condition

????????Condition(條件)是Java中用于線程之間通信的一種機制,常用于對線程的等待和喚醒操作。Condition通常與Lock一起使用,是Lock接口的一部分,用于替代傳統的Object的wait()和notify()/notifyAll()方法。在使用Condition時,首先需要獲得一個Lock對象,然后通過Lock對象的newCondition()方法創建一個Condition對象。線程可以通過Condition的await()方法進入等待狀態,當其他線程調用Condition的signal()或者signalAll()方法時,被等待的線程會被喚醒。使用Condition可以更加精細地控制線程的等待和喚醒,而不像使用Object的wait()和notify()/notifyAll()方法那樣具有局限性。

CountDownLatch(減少計數)

?CountDownLatch 是 Java 中的一個同步工具類,用于實現多個線程之間的同步,通過減少計數的方式實現線程之間的等待和通知。

  • CountDownLatch 內部維護一個計數器,通過 countDown() 方法遞減計數,通過 await() 方法阻塞調用線程,直到計數器為 0。
  • 在初始化 CountDownLatch 時需要指定計數器的初始值,每次調用 countDown() 方法都會使計數器減 1。
  • 當計數器減至 0 時,所有在 await() 方法上阻塞的線程都會被喚醒,可以繼續執行后續操作。


舉例:風火雷電四大法王都能封印魔獸,但是隨著一個個法王的離開,每次調用countDown()方法,直至沒有一個法王存在,魔獸就會蘇醒。

CyclicBarrier(循環柵欄)

????????CyclicBarrier(循環柵欄)是Java中的一個同步輔助工具,用于在多個線程之間實現同步。它允許一組線程全部達到一個同步點后再繼續執行。當所有線程達到同步點時,CyclicBarrier會釋放它們并重置,以便可以被重復使用。
????????CyclicBarrier是通過指定一個計數值來初始化,當調用await()方法時,線程會等待直到所有參與者都調用了該方法,此時所有線程會被釋放并繼續執行。CyclicBarrier的一個常見應用場景是將問題分解成多個子任務并行處理,在每個子任務完成后使用CyclicBarrier來等待所有子任務完成后才繼續執行其他操作。

舉例:召集七顆龍珠即可召喚神龍,每當獲取一顆龍珠,會調用await()方法進行等待,一直集齊七顆,才能召喚神龍。

Semaphore(信號燈)

????????Semaphore(信號量)是一個用于控制對共享資源的訪問的同步工具。它通常用于限制同時訪問某個共享資源的線程數量,或者進行線程之間的同步。在Java中,Semaphore提供了一種計數信號量,可以用來控制同時訪問某個資源的線程數量,也可以用來實現生產者-消費者模式。
????????Semaphore內部維護著一個計數器,初始化時指定初始的許可數量,線程可以通過acquire()方法獲取許可(如果計數器大于0則獲取成功,計數器減1),通過release()方法釋放許可(計數器加1),當計數器為0時,acquire()方法會阻塞線程,直到有其他線程釋放許可。

舉例:六輛汽車三個停車位,通過acquire()方法占用停車位,通過release()方法離開停車位,但是只能同時停三輛車。

ps:以下是我整理的java面試資料,密碼是obht,感興趣的可以看看。最后,創作不易,覺得寫得不錯的可以點點關注!

鏈接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面試寶典》?

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

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

相關文章

Flink狀態存儲-StateBackend

文章目錄 前言一、MemoryStateBackend二、FSStateBackend三、RocksDBStateBackend四、StateBackend配置方式五、狀態持久化六、狀態重分布OperatorState 重分布KeyedState 重分布 七、狀態過期 前言 Flink是一個流處理框架,它需要對數據流進行狀態管理以支持復雜的…

10個技巧,3分鐘教會你高效尋找開源項目

作為程序員,不論是開發還是學習,肯定會用到開源項目,那么怎么快速在開源網站找到這些項目呢? 常用的開源網站有:github 和 gitee github是全球最大的開源社區,今天就以github為例,演示一下 gi…

【vue】vue中數據雙向綁定原理/響應式原理,mvvm,mvc、mvp分別是什么

關于 vue 的原理主要有兩個重要內容,分別是 mvvm 數據雙向綁定原理,和 響應式原理 MVC(Model-View-Controller): Model(模型):表示應用程序的數據和業務邏輯。View(視圖&…

edge 安裝筆記

依賴項: jukebox 下載代碼GitHub - rodrigo-castellon/jukebox 拷貝到根目錄即可,文件夾留一個根目錄jukebox vqvae_cache_path cache_dir "/vqvae.pth.tar" prior_cache_path cache_dir "/prior_level_2.pth.tar"

JavaWeb之 Servlet(2萬6千字詳解)

目錄 前言1. Servlet 簡介2. Servlet 前世今生3. Servlet 執行流程4. Servlet 快速入門5. 兩種配置 Servlet程序 URL的方式5.1 使用 注解來配置 Servlet程序 的 URL5.1.1 urlPattern 的配置規則精確匹配目錄匹配:使用 * 符號代表任意路徑擴展名匹配任意匹配 5.1.2 小…

【MATLAB】語音信號識別與處理:SG濾波算法去噪及譜相減算法呈現頻譜

1 基本定義 SG 濾波算法(Savitzky - Golay 濾波算法)是一種數字信號處理算法,用于對信號進行平滑處理。該算法利用最小二乘法擬合局部數據段,然后用擬合的函數來估計每個數據點的值,從而實現平滑處理。 SG 濾波算法的…

redis05 sprngboot整合redis

redis的Java客戶端 整合步驟 添加redis的pom依賴 <!-- 引入redis依賴 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency><!-- 引入redis連…

51單片機學習day02

基于普中的stc89c52&#xff0c; 串口&#xff1a; 通訊接口&#xff0c;51單片機自帶UART&#xff08;通用異步收發器&#xff09;&#xff0c;可實現窗口通訊。 硬件電路&#xff1a; 簡單雙向串口通信有兩根通信線&#xff08;發送端TXD和接收端RXD&#xff09;&#xff0…

HelixToolKit的模型旋轉操作

前面加載了模型以后&#xff0c;鼠標拖動和縮放比較好操作&#xff1b;但是旋轉似乎沒有&#xff0c; 操作了一陣&#xff0c;也不是沒有&#xff0c;應該是還不熟悉&#xff1b; 旋轉的指示器在右下角&#xff0c;現在U面看到正面&#xff0c; 想看一下模型的背面&#xff0…

【Java項目介紹和界面搭建】拼圖小游戲——添加圖片

&#x1f36c; 博主介紹&#x1f468;?&#x1f393; 博主介紹&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高興認識大家~ ?主攻領域&#xff1a;【滲透領域】【應急響應】 【Java】 【VulnHub靶場復現】【面試分析】 &#x1f389;點贊?評論?收藏 …

扼殺網絡中的環路:STP、RSTP、MSTP

目錄 前言&#xff1a; 一、STP&#xff08;Spanning Tree Protocol&#xff09; 1.1 STP功能 1.2 STP應用 二、RSTP&#xff08;Rapid Spanning Tree Protocol&#xff09; 2.1 RSTP功能 2.2 RSTP應用 三、MSTP&#xff08;Multiple Spanning Tree Protocol&#xff0…

Angular 由一個bug說起之四:jsonEditor使用不當造成的bug

一&#xff1a;問題 項目中使用了一個JSON第三方庫&#xff1a; GitHub - josdejong/jsoneditor: A web-based tool to view, edit, format, and validate JSON 當用戶編輯JSON格式的數據&#xff0c;查找替換時&#xff1a; 用戶的期望結果是&#xff1a;$$ 被替換為$$_text&a…

[物聯網] OneNet 多協議TCP透傳

[物聯網] OneNet 多協議TCP透傳 STM32物聯網–ONENET云平臺的多協議接入產品創建 : https://blog.csdn.net/qq_44942724/article/details/134492924 Onenet tcp 透傳 : https://blog.csdn.net/flyme2010/article/details/107086001 tcp服務端測試工具 : http://tcp.xnkiot.com/…

zephyr學習

zephyr內核對象學習 定時器 類似linux的定時器&#xff0c; 可以分別設置第一次到期時間和后續的周期觸發時間&#xff0c; 可以注冊到期回調和停止回調 還有一個計數狀態&#xff0c;用于標記timer到期了多少次 duration&#xff1a;設定timer第一次到期的時間。 period: …

SpringBoot3.2.0整合MyBatis-plus的相關問題及處理方法

SpringBoot3.2.0整合MyBatis-plus的相關問題 文章目錄 SpringBoot3.2.0整合MyBatis-plus的相關問題1. build.gradle2. mybatis-plus整合問題1. 錯誤描述2. 問題分析及解決1. 原因分析2. 解決方式 Springboot3.2.0 GA版發布于 2023-11-24 環境&#xff1a;SpringBoot3.2.0Gradle…

【蛀牙】日常生活如何正確護理牙齒?刷牙、洗牙、補牙

程序員生活指南之 【蛀牙】日常生活如何正確護理牙齒&#xff1f;刷牙、洗牙、補牙 文章目錄 一、日常如何清洗牙齒&#xff1f;——刷牙與洗牙1、牙齒污垢1.1 牙菌斑1.2 軟垢1.3 牙結石1.4 牙齦出血 2、如何刷牙2.1 關于時間2.2 各種工具2.3 巴氏刷牙法 二、定期進行洗牙3、如…

題目 1076: 內部收益率

題目描述: 在金融中&#xff0c;我們有時會用內部收益率IRR來評價項目的投資財務效益&#xff0c;它等于使得投資凈現值NPV等于0的貼現率。換句話說&#xff0c;給定項目的期數T、初始現金流CF0和項目各期的現金流CF1, CF2, ...&#xff0c;CFT&#xff0c;IRR是下面方程的解&…

RISC-V特權架構 - 特權模式與指令

RV32/64 特權架構 - 特權模式與指令 1 特權模式2 特權指令2.1 mret&#xff08;從機器模式返回到先前的模式&#xff09;2.2 sret&#xff08;從監管模式返回到先前的模式&#xff09;2.3 wfi&#xff08;等待中斷&#xff09;2.4 sfence.vma&#xff08;內存屏障&#xff09; …

SpringBoot+Vue+MySQL:裝修管理新架構探索

??計算機畢業編程指導師 ??個人介紹&#xff1a;自己非常喜歡研究技術問題&#xff01;專業做Java、Python、微信小程序、安卓、大數據、爬蟲、Golang、大屏等實戰項目。 ??實戰項目&#xff1a;有源碼或者技術上的問題歡迎在評論區一起討論交流&#xff01; ?? Java、…

FPGA開源項目分享——2D N-Body重力模擬器

?導語 今天繼續康奈爾大學FPGA 課程ECE 5760的典型案例分享——2D N-Body重力模擬器。 &#xff08;更多其他案例請參考網站&#xff1a; Final Projects ECE 5760&#xff09; 1. 項目概述 項目網址 Grav Sim 項目說明 該項目的目標是創建一個用DE1-SOC進行硬件加速的2…