AQS锁原理

news2024/11/27 1:23:09

文章目录

  • 一、AQS是什么?
  • 二、AQS原理
  • 三、STATE:状态
  • 四、AQS共享资源的方式:独占式和共享式
    • 4.1 独占式实现
    • 4.1 共享式
  • 总结



一、AQS是什么?

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

二、AQS原理

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

三、STATE:状态

Abstract Queued Synchronizer维护了一个volatile int类型的变量state,用于表示当前的同步状态。Volatile虽然不能保证操作的原子性,但是能保证当前变量state的可见性。

state的访问方式有三种:getState(),setState()、compareAndSetState()均是原子操作,其中,compareAndSetState的实现依赖于Unsafe的compareAndSwapInt()。具体的JDK代码实现如下:

	/**
    * 锁的状态
    */
    private volatile int state;

	//返回共享资源状态,此操作的内存语义为volatile修饰的原子读操作
	protected final int getState() {
        return state;
    }
    
	//设置共享资源状态,此操作的内存语义为volatile修饰的原子写操作
	protected final void setState(int newState) {
        state = newState;
    }
    /*
    *如果当前状态值等于预期值,则原子化地将同步状态设置为给定的更新值。
    *此操作的内存语义为volatile修饰的原子读写操作
    */
    protected final boolean compareAndSetState(int expect, int update) {
        // See below for intrinsics setup to support this
        return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
    }

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

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

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

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

4.1 独占式实现

ReentrantLock对AQS的独占方式实现为:ReentrantLock中的state初始值为0时表示无锁状态。在线程执行tryAcquire()获取该锁后ReentrantLock中的state+1,这时该线程独占ReentrantLock锁,其他线程在通过tryAcquire()获取锁时均会失败,直到该线程释放锁后state再次为0,其他线程才有机会获取该锁。该线程在释放锁之前可以重复获取此锁,每获取一次便会执行一次state+1,因此ReentrantLock也属于可重入锁。但获取多少次锁就要释放多少次锁这样才能保证state最终为0。如果获取锁的次数多于释放锁的次数,则会出现该线程一直持有该锁的情况;如果获取锁的次数少于释放锁的次数,则运行中的程序会报锁异常。

4.1 共享式

CountDownLatch对AQS的共享方式实现为:CountDownLatch将任务分为N个子线程去执行,将state也初始化为N, N与线程的个数一致,N个子线程是并行执行的,每个子线程都在执行完成后countDown()一次,state会执行CAS操作并减1。在所有子线程都执行完成(state=0)时会unpark()主线程,然后主线程会从await()返回,继续执行后续的动作。


总结

AQS是juc包下lock接口的底层实现原理,其维护了一个维护了一个volatile int类型的变量state用来表示锁的状态,并且底层维护了一个双向队列用来阻塞竞争锁的线程,提供了独占式和共享式的资源获取方式,有公平与非公平锁的实现原理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

节距信号发生器(成缆变节距控制)

成缆机系统控制,请查看下面文章链接 ,这篇文章主要介绍节距信号发生器算法原理和代码,博途PLC信号发生器链接地址如下: PLC信号发生器(博途SCL)_RXXW_Dor的博客-CSDN博客信号发生器的应用请参看下面的博客文章,在演示滤波器的作用时,我们可能也会用到信号的叠加等。博途…

嵌入式学习笔记(29)轮询方式处理按键

X210开发板的按键接法 (1)查原理图,找到按键对应的GPIO:SW5:GPH0_2 SW6:GPH0_3 SW78910:GPH2_0123 (2)原理图上可看出:按下时是低电平,弹起时是高电平。 按键对应的GPIO模式设置 …

gcc/c++ 版本不一致问题导致的

1.问题 rk3566板子的系统是ubuntu20.04 focal, /etc/apt/source.list更换为阿里源 x86-67的pc主机系统的是ubuntu20.04 jammy /etc/apt/source.list 更换为清华源 按照rknpu2的开发教程Rockchip_Quick_Start_RKNN_SDK_V1.5.2_CN.pdf: 交叉编…

C语言--strcat函数

C语言–strcat函数 文章目录 C语言--strcat函数一、strcat函数是什么?二、使用示例二、模拟实现 一、strcat函数是什么? 作用是把源数据追加到目标空间 char * strcat ( char * destination, const char * source );源字符串必须以 ‘\0’ 结束。目标空…

SqlServer在尝试加载程序集 ID 65917 时 Microsoft .NET Framework 出错。服务器可能资源不足,或者不信任该程序集

问题:在尝试加载程序集 ID 65917 时 Microsoft .NET Framework 出错。服务器可能资源不足,或者不信任该程序集,因为它的 PERMISSION_SET 设置为 EXTERNAL_ACCESS 或 UNSAFE。 检查数据库属性:检查服务器是否信任该程序集 解决方法…

PMP考试是什么?适合哪些人学?

PMP,Project Management Professional的缩写,中文名为“项目管理专业人士资格认证”,是由美国项目管理协会(PMI)发起的,严格评估项目管理人员知识技能是否具有高品质的资格认证考试。 PMP是管理专门用于项…

【面试必刷TOP101】合并k个已排序的链表 判断链表中是否有环

目录 题目:合并k个已排序的链表_牛客题霸_牛客网 (nowcoder.com) 题目的接口: 解题思路: 代码: 过啦!!! 题目:判断链表中是否有环_牛客题霸_牛客网 (nowcoder.com) 题目的接口…

【JAVA】idea初步使用+JDK详细配置

1、官方下载idea 官网:Download IntelliJ IDEA – The Leading Java and Kotlin IDE (1)、下载教程 我下载没截屏,详细教程请看 原文:手把手教你JDKIDEA的安装和环境配置_idea配置jdk_快到锅里来呀的博客-CSDN博客 2、启动项目时候需要配置J…

OpenMMLab MMYOLO目标检测算法原理(二)

算法原理及YOLOV5实现 YOLOv5是一种面向实时工业应用的开源目标检测算法,受到了广泛的关注。YOLOv5之所以能火爆,并不仅仅是因为其优异的性能。它更多的是关于其库的整体实用性和稳健性。简而言之,YOLOv5的主要特点是: &#xff…

vue前后端分离单点登录,结合长token和短token进行登录

单点登录背景 在公司发展初期,公司拥有的系统不多,通常一个两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登陆,很方便,但是,随着企业的发展,用到的系统随之增加&#x…

纯干货|AI辅助写论文的正确打开方式!

论文写作中可能遇到问题 1. 选题问题:是否无法确定研究方向和选择合适的题目? 2. 文献综述问题:是否困惑如何进行文献调研和综述? 3. 方法论问题:是否不知道该选择何种研究方法? 4. 数据处理问题&#…

复杂场景:民族工业如何做大,主数据管理助力这家标杆工业企业领跑全球

项目背景 大族激光成立于1999年,总部位于中国深圳。是一家从事工业激光加工设备与自动化等配套设备及其关键器件的研发、生产、销售的制造业企业,公司的产品广泛应用于工业制造、通信、医疗、电子、消费电子、光通讯等领域。经过多年的发展,大…

一文看懂Oracle 19c OCM认证考试(需要Oracle OCP证书)

Oracle OCM的认证全称是Oracle Certified Master,是比OCP更高一级的认证,姚远老师的很多OCP学员都对OCM考试有兴趣,这里跟大家做个介绍。 OCM考试全部是上机的实操考试,没有笔试,要到Oracle原厂参加两天的考试。参加1…

【ABAP】如何理解SAP中的CLIENT (客户端)

💂作者简介: THUNDER王,阿里云社区专家博主,华为云云享专家,腾讯云社区认证作者,CSDN SAP应用技术领域优质创作者。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成…

蓝牙资讯|苹果新款AirPods Pro支持Vision Pro无损音频和IP54防水防尘

苹果公司宣称,USB-C 能够带来更多灵活性,现在用户可以使用手机的 USB-C 接口,为 AirPods Pro 耳机盒充电。 虽然苹果没有详细介绍这款耳机,但在今天的新闻稿中依然透露了一些不一样的地方,例如新款 AirPods Pro 2 升…

GaussDB技术解读系列:运维自动驾驶探索

近日,在第14届中国数据库技术大会(DTCC2023)的GaussDB“五高两易”核心技术,给世界一个更优选择专场,华为云数据库运维研发总监李东详细解读了GaussDB运维系统自动驾驶探索和实践。 随着企业数字化转型进入深水区&…

股票数据分析应用之可视化图表组件

股市是市场经济的必然产物,在一个国家的金融领域之中有着举足轻重的地位。在过去,人们对于市场走势的把握主要依赖于经验和直觉,往往容易受到主观因素的影响,导致决策上出现偏差。如今,通过数据可视化呈现,…

SAP MM会计凭证凭证状态为U

往成本中心发料后,SAP产生会计凭证状态为U: 会计凭证存在ACDOC 和 BKPF但是不存在BSEG 原因:物料主数据没有计划价格。

王道数据结构C语言顺序表基本操作实现

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdbool.h> #define MaxSize 50 typedef struct {//顺序表(静态实现)int data[MaxSize];//顺序表元素int length;//顺序表当前长度 }SqList;//类型定义#define InitSize 100; typedef struct {//动态实…

智能二创文案软件-生成文案改写文案的软件

咱们都知道&#xff0c;写作是一项既耗时又考验创造力的任务。有时候&#xff0c;我们可能会陷入创意枯竭的困境&#xff0c;不知道该如何表达自己的想法。这时候&#xff0c;智能二创文案软件就出现在我们的视野中&#xff0c;它们声称可以帮助我们生成文案&#xff0c;省去了…