java并发编程 10:AQS

目录

  • 什么是AQS
  • 原理

什么是AQS

juc包的结构如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlrXs1em-1689247459660)(./imgs/10-1.png)]

AQS就是AbstractQueuedSynchronizer,是个抽象类,实现了自己的一些方法。它是阻塞式锁和相关的同步器工具的框架。很多并发类都是基于它实现的,如:ReentrantLock、CountDownLatch、Semaphore、ReadWriteLock,CyclicBarrier。

AQS的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法将会调用使用者重写的方法,这样就大大降低了实现一个可靠自定义同步组件的门槛。

子类主要实现以下抽象方法:

  • tryAcquire:独占方式获取锁
  • tryRelease:独占方式释放锁
  • tryAcquireShared:共享方式获取锁
  • tryReleaseShared:共享方式释放锁
  • isHeldExclusively:该线程是否正在独占资源

原理

  1. 状态管理

AQS内部通过一个整型变量来表示同步状态,用于标识资源是否被占用或者线程是否可以获取资源。通常情况下,状态为0表示资源未被占用,大于0表示资源已被占用,小于0表示资源已被占用且有等待线程。

  1. 队列管理

AQS使用一个FIFO队列来管理等待获取资源的线程。AQS提供了一些方法(如enq、addWaiter和unparkSuccessor)来操作队列。

当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。节点(Node)用来保存获取同步状态失败的线程引用、等待状态以及前驱和后继节点。同步队列的基本结构如图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zVSC1c62-1689247459661)(./imgs/10-2.png)]

  1. acquire方法

acquire方法是AQS的核心方法之一,用于实现线程对资源的获取。当线程调用acquire方法时,AQS首先会通过尝试CAS(Compare and Set)操作来竞争资源。如果成功获取资源,则线程可以继续执行;否则,线程将被加入到等待队列中,进入阻塞状态,直到资源被释放。

  1. release方法

    release方法是AQS的另一个核心方法,用于实现线程对资源的释放。当线程调用release方法时,AQS会先将同步状态更新为0,然后尝试唤醒等待队列中的其他线程,使它们有机会重新竞争资源。

  2. 共享模式和独占模式

    AQS支持两种同步模式:独占模式和共享模式。独占模式表示同一时间只能有一个线程持有资源,而共享模式则允许多个线程同时持有资源。AQS提供了对应的acquire和release方法来支持这两种模式,并且可以在不同的同步器中灵活地选择使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21630.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机视觉】简述对EQ-Net的理解

最近又看了一些点云分割的文章,近两年点云分割的文章是真的少,不知道是不是点云分割算法接近了末端。这篇文章主要提出了一个基于查询方法的统一范式,它解决了一些不仅仅是点云分割的问题,还解决了三维点云分类和三维目标检测的问…

牧云·云原生安全平台v2.0.0正式上线,云上想不安全都难!

**前言:**牧云云原生安全平台是长亭牧云团队以开源社区为生态载体技术积累为驱动所打造的云原生安全平台。首创双模探针架构,可选用 Agentless/Agent 多种方案进行部署,覆盖制品、运行时、集群全流程安全,开箱即用、快速实施、成本…

设计模式——观察者模式

观察者模式(世界线的观测者) 定义 观察者模式(Observer Partern)也叫做发布/订阅模式(Publish/Subscribe),一种以监听为核心的设计模式。 定义对象间一种一对多的依赖关系,使得每…

UG\NX二次开发 获取对象的边界包容盒 UF_MODL_ask_bounding_box

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 获取对象的边界包容盒 UF_MODL_ask_bounding_box,只能得到绝对坐标系下的边界包容盒,速度快,结果不精确。 效果: 代码: //UF_MODL_ask_bounding_box #include "me.hpp" #include &…

vscode 端口转发实现端口映射,实现端口自由

用vscode连接server进行开发, 是非常方便的,但很多时候,server的端口开放的很有限,那么就可以利用vscode进行端口映射 举一个应用场景: 先通过A利用vscode 连接B,然后再vscode 的port窗口进行端口转发&…

美工面试题目(合集)

美工面试题目篇1 1、目前常用的WEB标准静态页面语言是。(4分) 2、改变元素的外边距用,改变元素的内填充用。(6分) 3、在Table中,TR是,TD是。(6分) 4、如果给一行两列的表格(table)定义高度样式,在标签中定义最合理&#xff0c…

springboot人事管理系统

本项目在开发和设计过程中涉及到原理和技术有: B/S、java技术和MySQL数据库等等;将按以下章节进行开发设计; 绪论;剖析项目背景,说明研究的内容。 开发技术;系统主要使用了java技术,b/s模式和myspl数据库,并…

从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别

目录 1. 关联式容器 1.1 树形结构的关联式容器 2. set的相关介绍 2.1 set的构造和迭代器 2.2 set的容量和操作函数 2.3 set使用代码 2.4 multiset使用 3. map的相关介绍 3.1 键值对 3.2 map的构造和迭代器 3.3 map的容量和操作函数 3.4 map使用代码 3.5 multimap使…

python脚本(Word转PDF格式小工具)

from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QMessageBox from PyQt5.QtCore import Qt import sys import os from comtypes import client#文件转换脚本 class FileDropWidget(QWidget):def __init__(self):super().__init__()self.initUI()de…

应用于智能眼镜上实现检测功能的距离传感芯片

随着智能穿戴设备的发展,各种新型的电子产品不断被研发出来,诸如智能头盔、智能手表、智能手环等等,智能眼镜就是其中一种,国内华为、小米相继推出智能产品。 智能眼镜具有和智能耳机相似的功能,不仅保留眼镜本身功能…

十七、web网页像素知识

目录: 像素视口 一、像素 像素:- 屏幕是由一个个发光的小点构成,这一个个的小点就是像素- 分辨率:1920 x 1080 说的就是屏幕中小点的数量- 在前端开发中像素要分成两种情况讨论:css像素和物理像素- 物理像素&#xff…

雪花算法 — 集群高并发情况下如何保证分布式唯一全局ID生成?

雪花算法 问题 为什么需要分布式全局唯一ID以及分布式ID的业务需求 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识: 如在美团点评的金融、支付、餐饮、酒店猫眼电影等产品的系统中数据逐渐增长,对数据库分库分表后需要有一…