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.mzph.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…