什么是AQS

article/2025/10/7 19:16:03

        AQS ( Abstract Queued Synchronizer )是一个抽象的队列同步器,通过维护一个共享资源状态( Volatile Int State )和一个先进先出( FIFO )的线程等待队列来实现一个多线程访问共享资源的同步框架。

一、AQS原理

         AQS 为每个共享资源都设置一个共享资源锁,线程在需要访问共享资源时首先需要获取共享资源锁,如果获取到了共享资源锁,便可以在当前线程中使用该共享资源,如果获取不到,则将该线程放入线程等待队列,等待下一次资源调度,具体的流程如图 -14所示。许多同步类的实现都依赖于AQS ,例如常用的 ReentrantLock、Semaphore、CountDownLatch。

 

二、state:状态

        Abstract Queued Synchronizer 维护了 volatile int 类型的变量,用于表示当前的同步状态。volatile虽然不能保证操作的原子性,但是能保证当前变量state的可见性。
        state的访问方式有三种: getState()、setState()和 compareAndSetState(),均是原子操作,其中,compareAndSetState的实现依赖于 Unsafe的compareAndSwaplnt() 具体的。JDK 码实现如下:

三、AQS共享资源的方式:独占式和共享式

        AQS 定义了两种资源共享方式 :独占式 (Exclusive)和共享式(Share)

  • 独占式:只有一个线程能执行,具体的 Java 实现有 ReentrantLock。
  • 共享式:多个线程可同时执行,具体的 Java 实现有 Semaphore和CountDownLatch。

        AQS只是一个框架 ,只定义了一个接口,具体资源的获取、释放都 由自定义同步器去实现。不同的自定义同步器争用共享资源的方式也不同,自定义同步器在实现时只需实现共享资源state的获取与释放方式即可,至于具体线程等待队列的维护,如获取资源失败入队、唤醒出队等, AQS 已经在顶层实现好,不需要具体的同步器再做处理。自定义同步器的主要方法如表 3-4 所示:

        同步器的实现是 AQS的核心内存。 ReentrantLock对AQS的独占方式实现为:ReentrantLock中的state初始值为0表示无锁状态。在线程执行 tryAcquire()获取该锁后ReentrantLock中的state+1,这时该线程独占ReentrantLock锁,其他线程在通过tryAcquire() 获取锁时均会失败,直到该线程释放锁后state再次为0,其他线程才有机会获取该锁。该线程在释放锁之前可以重复获取此锁,每获取一次便会执行一次state+1, 因此ReentrantLock也属于可重入锁。 但获取多少次锁就要释放多少次锁,这样才能保证state最终为0。如果获取锁的次数多于释放锁的次数,则会出现该线程一直持有该锁的情况;如果获取锁的次数少于释放锁的次数,则运行中的程序会报锁异常。
        CountDownLatch对AQS的共享方式实现为:CountDownLatch 将任务分为N个子线程去执行,将 state 初始化为 N, N与线程的个数一致,N个子线程是井行执行的,每个子线程都在执行完成后 countDown()1次, state 执行 CAS 操作并减1。在所有子线程都执行完成( state=O)时会unpark()主线程,然后主线程会从 await()返回,继续执行后续的动作。

        一般来说,自定义同步器要么采用独占方式,要么采用共享方式 ,实现类只需实现tryAcquire、tryseAcquireShared、tryReleaseShared 中的一组即可。但AQS也支持自定义同步器同时实现独占和共享两种方式,例如 ReentrantReadWriteLock 在读取时采用了共享方式,在写入时采用了独占方式。


http://chatgpt.dhexx.cn/article/CTwVYVgX.shtml

相关文章

泛函分析之变分法

泛函数 以上截图来自于《变分法简介Part 1.(Calculus of Variations)》 变分法 研究泛函极值的方法就是所谓变分法。 以上截图来自于《最速降线的数学模型—变分法》 欧拉-拉格朗日方程

mathematica变分法和样条插值求解最小旋转曲面

mathematica求解最小面积旋转曲面 做你没做过的事叫成长,做你不愿做做的事叫改变,做你不敢做的事叫突破。—— 巴菲特 问题描述: 在一条直线的同一侧有两个已知点,试找出一条连接这两点的曲线,使这条曲线绕直线旋转所…

变分法模型的运用:生产设备的最大经济效益

上一节介绍了 动态优化模型/ 变分法 的基本思想,本节将一个变分法的运用。 目录 1 问题分析与假设 2 模型构造 3 模型求解 变分法习题 某工厂购买了一台新设备投入到生产中。一方面该设备随着运行时间的推…

简述变分法在泛函极值问题中的应用

此文主要有两部分内容,一部分是泛函的一些基本概念;第二部分是变分法在研究泛函极值问题中的应用。 第一部分 泛函 泛函是函数概念的一种扩充,函数描述的是从数到数的对应关系,从自变量到因变量的一种对应关系;而泛函…

变分法(欧拉 - 拉格朗日)和梯度下降求泛函最优解

泛函的简单理解: 是的变量, 这样的就叫泛函 . 加个积分,这样的就叫积分泛函 . 欧拉 - 拉格朗日 (E - L) 公式: 定义一个能量泛函如下: 我们的目的是找到能使 取到极值的时候 的取值,所以我们就假设 就…

第二章-最优控制中的变分法(经典变分法或古典变分法)1

是《最优控制理论与应用(邵克勇,王婷婷,宋金波)》的读书笔记,相比于其他的书,选择这本书的理由是页数少,能读完。解学书的《最优控制理论与应用》看目录感觉很全,但是太厚了,感觉看不完。 虽然…

变分法理解1——泛函简介

变分法是处理泛函的数学领域,和处理函数的传统微积分相对。 对泛函求极值的问题称为变分问题,使泛函取极值的函数称为变分问题的解,也称为极值函数。 传统的微积分中的一个常见的问题是找到一个 x x x 值使得 y ( x ) y(x) y(x) 取得最大值…

变分法证明两点之间线段最短

传送门https://zhuanlan.zhihu.com/yueaptx 变分法简介Part 1.(Calculus of Variations) Dr.Stein 计算力学 ​关注他 283 人赞了该文章 泛函数 (Functionals) 简而言之,泛函数是函数的函数,即它的输入是函数,输出…

最优控制理论 一、变分法和泛函极值问题

变分法是最优控制问题的三大基石之一,下面讨论一些变分法的常用理论。 1. 性能指标泛函 无约束最优控制问题,若固定起止时间,两端状态固定,即 x ( 0 ) x 0 , x ( t f ) x f , t ∈ [ 0 , t f ] x(0)x_0, x(t_f)x_f, t\in[0,t…

[变分法介绍]优美的旋轮线:最速下降线问题,通过费马光学原理的初等证明

[变分法介绍]优美的旋轮线:最速下降线问题,通过费马光学原理的初等证明 变分法 费马光学原理最速下降线问题旋轮线旋轮线最速下降性质的证明一些旋轮线及变形参考书目:1696年约翰伯努利在写给他哥哥雅克布伯努利的一封公开信中提出了如下的“捷线”问题:设想一个质点沿连接…

深入浅出解析变分法——一种常用的数学方法

前言:笔者从事图像处理行业,总是接触到变分法这个概念,一直没有很深入的去理解这个概念,同时我看其他大佬的博文也比较糊涂,因此最近花了一些时间好好梳理了这部分数学知识。文章共3部分,主要是对变分法的解…

变分法:在图像处理中的应用(一)

前言 最近学习稠密重建的相关知识,发现变分法通常作为一个平滑的正则项出现在残差平方和的损失函数中。而图像处理中又经常出现这类最小损失函数的优化问题,如图像分割、稠密光流、稠密重建等等,这些优化问题中都有可能涉及到变分法。因此&am…

电磁仿真原理——3. 变分法(Variationl Methods)

目录 引言线性空间的算子问题变分的计算问题欧拉公式 构造泛函的方法利用分部积分构造利用标准变分原理构造 瑞利一里茨法加权留数法本征问题变分的实际应用 引言 由于课程后面重点的矩量法和有限元法都是基于变分法进行的,变分法是它们的数学基础,实际…

泛函极值问题与变分法

泛函与泛函极值问题 平面内两点A,B,连接两点之间的曲线有很多种方式。分别用函数 f i ( x ) f_{i}(x) fi​(x)来表示。对于给定的曲线 f i ( x ) f_{i}(x) fi​(x), 那么两点之间连线的长度可以表示为 J ( f i ( x ) ) ∫ A B 1 f i ′ ( x ) 2 d x J…

【Matlab】变分法求控制器(无约束)

在动态最优控制中,目标函数是一个泛函数,求解动态最优化问题可以看做是求泛函极值的问题,求解泛函极值有一个方法,即变分法,本文章便介绍有关变分法的一些自己的学习理解。 变分法的基本概念 泛函 如果一个因变量的…

关于变分法

在介绍变分贝叶斯之前,首先以这篇博客介绍下大名鼎鼎的变分法。 参考资料主要是知乎的文章与维基百科。 变分就是函数的微分。 回顾一下传统的函数优化问题。 对于 min ⁡ x f ( x ) \min_x f(x) minx​f(x)这样的优化问题,求取最优的 x x x的做法常用…

变分法

变分法 弦平衡方程的导出,建立起横向位移u,张力T,外力f之间的关系: 方一、根据受力平衡导出 推导时用的技巧或假设: 1.泰勒展开近似 同理 2. 3.小变形假设,张力均匀,即 4.方程推导中忽略二…

变分法入门介绍

文章目录 变分法入门介绍泛函和变分法变分法求泛函极值变分的定义拉格朗日函数欧拉方程 案例分析--两点之间直线最短在Mathematica中使用变分法参考文献 变分法入门介绍 读完这篇博文你可以了解变分的基本概念,以及使用变分法求解最简泛函的极值。本文没有严密的数…

能量原理和变分法笔记1:变分法简介

上个学期在学校学了多体系统动力学的课,其中老师讲了变分原理,觉得很有启发,决定再学学相关的知识,在B站找到了一个这样的视频能量原理与变分法,做点笔记,加深一下理解。 第0章序言-微元、功和能(P2) 第1章…

机器学习——变分法、拉格朗日乘子

文章目录 一、变分法二、Lagrange 乘子2.1 一般约束的拉格朗日乘子2.2 带不等式约束的拉格朗日乘子2.3 多约束问题 一、变分法 引入 函数 y ( x ) y(x) y(x) 可以看成一种操作符,即对于任意 x x x,返回一个输出 y y y。在这种情况下,我们…