Java之AQS(AbstractQueuedSynchronizer)

Java之AQS(AbstractQueuedSynchronizer

AQS 介绍

AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。

image.png

● 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现
● 是重量级基础框架及整个JUC体系的基石,主要用于解决锁分配给”谁“的问题。
● 整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态

public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {
}

AQS 为构建锁和同步器提供了一些通用功能的实现,因此,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue等等皆是基于 AQS 的

image.png

image.png

AQS为什么是JUC内容中最重要的基石

和AQS有关的

image.png

ReentrantLock

image.png

CountDownLatch

image.png

● 进一步理解锁和同步器的关系
○ 锁,面向锁的使用者:定义了程序员和锁交互的使用层API,隐藏了实现细节,你调用即可
○ 同步器,面向锁的实现者:Java并发大神DoungLee,提出了统一规范并简化了锁的实现,将其抽象出来,屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等,是一切锁和同步组件实现的----公共基础部分

AQS 核心思想

AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是基于 CLH 锁变体 (Craig, Landin, and Hagersten locks) 实现的。

CLH 锁是对自旋锁的一种改进,是一个虚拟的双向队列(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系),暂时获取不到锁的线程将被加入到该队列中。AQS 将每条请求共享资源的线程封装成一个 CLH 队列锁的一个结点(Node)来实现锁的分配。在 CLH 队列锁中,一个节点表示一个线程,它保存着线程的引用(thread)、 当前节点在队列中的状态(waitStatus)、前驱节点(prev)、后继节点(next)。

CLH 队列结构如下图所示:

CLH 队列结构

AQS(AbstractQueuedSynchronizer)的核心原理图:

CLH 队列

AQS内部体系架构----AQS自身

  • AQS的int类型变量state

    • AQS的同步状态State成员变量

image.png

另外,状态信息 state 可以通过 protected 类型的getState()setState()compareAndSetState() 进行操作。并且,这几个方法都是 final 修饰的,在子类中无法被重写。

//返回同步状态的当前值
protected final int getState() {return state;
}// 设置同步状态的值
protected final void setState(int newState) {state = newState;
}
//原子地(CAS操作)将同步状态值设置为给定值update如果当前同步状态的值等于expect(期望值)
protected final boolean compareAndSetState(int expect, int update) {return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
------
著作权归JavaGuide(javaguide.cn)所有
基于MIT协议
原文链接:https://javaguide.cn/java/concurrent/aqs.html

著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/java/concurrent/aqs.html

  • AQS的CLH队列

    • CLH(三个大牛的名字组成)队列为一个双向队列

image.png

AQS内部体系架构----内部类Node

  • Node的int变量

    • Node的等待状态waitState成员变量
    • image.png
    • 说人话
      • 等候区其他顾客(其他线程)的等待状态
      • 队列中每个排队的个体就是一个Node
  • Node此类的讲解

    • 内部结构

image.png

image.png

以Reentrantlock的实现来分析AQS的原理及应用

由于篇幅过长放在下一篇文章中

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

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

相关文章

java中Arrays类的讲解

介绍 在java.util中有一个Arrays类,此类包含用于操纵数组的各种方法,例如:二分查找(binarySearch)、拷贝操作(copyOf)、比较(equals)、填充(fill)、排序(sort)等&#xf…

mysql 1055 解决方案_MySQL报错1055解决方案 - 树懒学堂

相信大家在使用MySQL数据库的过程中,或多或少都遇到报错。在mysql版本更新到5.7之后,有一个新的报错出现的次数越来越频繁,它就是MySQL 1055 报错。本文就给大家介绍一下MySQL 1055报错的原因以及解决的思路,并给出两种具体的解决…

SpringBoot 3.0最低版本要求的JDK 17,这几个新特性不能不知道

最近,有很多人在传说 SpringBoot要出3.0的版本了,并且宣布不再支持 Java 8,最低要求是 Java 17了。 其实,早在2021年9月份,关于 Spring Framework 6.0的消息出来的时候,Spring 官方就已经明确了不会向下兼…

jmeter mysql数据导出_Jmeter连接mysql

一、下载添加jar包image.png添加方法:1.拷贝到jmeter/lib目录下,此方法需重启jmeter2.直接在jmeter的测试计划中导入image.png二、连接mysql数据库添加配置元件-JDBC Connection Configurationimage.pngimage.png1.Variable Name for created pool&#…

判断一个坐标点是否在不规则多边形内部的算法

参考:https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html 在GIS(地理信息管理系统)中,判断一个坐标是否在多边形内部是个经常要遇到的问题。乍听起来还挺复杂。根据W. Randolph Franklin 提出的PNPoly算法,…

cos7安装mysql_centos7 安装 mysql

centos7 安装 mysql1. 卸载MariaDB, centos 7 自带的[rootesbu-cos7-01 /]# rpm -qa|grep -i mariadb用命令卸载 rpm -e --nodeps2. 官网下载https://dev.mysql.com/downloads/mysql/5.7.html#downloads3. 解压 tar -xvf#tar -xvf mysql-5.7.22-1.el7.x86_64.rpm-bundle由于是…

MySQL中LIMIT的使用方法

一、任务描述 搜索表结构中的某些部分的数据,比如,最后面三个,最前面三个,第2到8条记录,等等。 二、实战演练 1、 select * from tablename order by orderfield desc/asc limit position, counter&#…

mysql++多版本安装_MySQL多版本多实例安装启动

多版本,大版本不同测试多实例,一个MySQL5.7.30一个MySQL8.0.20解压8.0tar -xvf mysql-8.0.20-linux-glibc2.12-x86_64.tartar -xJf mysql-8.0.20-linux-glibc2.12-x86_64.tar.xz改名移动/mysql8.0.20mv mysql-8.0.20-linux-glibc2.12-x86_64 /mysql8.0.2…

MySQL数据库查询优化技巧

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t…

cheungssh mysql密码_CheungSSH安装及基本使用

CheungSSH比Ansible的使用更简单,尤其是配置方面!而Ansible有的功能, 我的这个程序一样有,和Ansible一样是python开发, 所以跟Ansible的模式一样, 但是CheungSSH 操作更简单!配置更轻量&#xf…

MySQL100万条数据的一张表,如何查询优化?

1.两种查询引擎查询速度(myIsam 引擎 ) InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行。 MyISAM只要简单的读出保存好的行数即可。 注意的是&…

mysql增删改查操作语句_学习笔记-mysql增删改查操作语句

1.mysql增删改查操作语句:1)如果想在一个已经建好的表中添加一列,可以用以下代码:alter table t1 add column addr varchar(20) not null;2)这条语句会向已有的表t1中加入一列,这一列在表的最后一列位置。如果我们希望添加在指定的…

mybatis group by 分组查询:将返回结果封装为map

文章目录1. 最简单但性能最差的做法2. 使用group by分组查询&#xff0c;将查询结果封装成类3.group by分组查询&#xff0c;将结果封装为map。直接封装为map&#xff1f;List1. 最简单但性能最差的做法 在逻辑层分多次对数据库进行查询。伪代码如下。 List<String> na…

esl证明函 oracle_强弱分明 Astralis证明之战—ESL科隆B组浅析

HLTV排名前16名中的13支队伍(缺席的是G2和North)将齐聚这座坐落在莱茵河畔的城市进行厮杀&#xff0c;争夺比赛的最高荣誉。这项赛事也是继今年卡托维茨Major以来含金量最高&#xff0c;强队参赛最多的线下赛事。下面我们就来分析一下B组的出线形势。B组分组*本次比赛的赛制依旧…

关于new ArrayList()和Collections.emptyList()

很明显 new ArrayList()是创建一个Collection实例&#xff0c;它是Collection集合下面的一个实现类&#xff08;中间继承了AbstractList&#xff09;&#xff0c;它的实例有Collection的增加&#xff0c;删除&#xff0c;修改等方法&#xff0c; ArrayList平常用的很多&#x…

mysql 1418错误_mysql 1418错误原因及解决

摘自 http://blog.sina.com.cn/s/blog_6f68845001013k8a.html具体错误&#xff1a;使用mysql创建、调用存储过程&#xff0c;函数以及触发器的时候会有错误符号为1418错误。ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL,or READS SQL DATA in its dec…

ArrayList()和Collections.emptyList()的区别emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方

前言 Java中ArrayList或许是我们平时开发最常用的一个集合类了&#xff0c;其次是HashMap&#xff0c;基本上满足了业务开发的绝大多数场景。今天要说的就是Collections.emptyList()和new ArrayList()的区别以及注意事项。 先来一段代码 运行main方法&#xff0c;会有如下输出…

mysql 5.6加用户_Mysql 5.6添加修改用户名和密码的方法

先登录MySQLshell> mysql --userroot mysql有密码的需要添加 –password 或-p 选项添加用户mysql>CREATE USER finleylocalhost IDENTIFIED BY some_pass;mysql>GRANT ALL PRIVILEGES ON *.* TO finleylocalhost WITH GRANT OPTION;mysql>CREATE USER finley% IDEN…

java中SimpleDateFormat线程安全问题及解决方案

最近看到一篇文章提到了SimpleDateFormat这个类。说这个类在单线程程序中没问题&#xff0c;但是在多线程环境下会线程安全的问题。 出于兴趣对这个问题进行了查证。网上有很多关于这个问题的文章&#xff0c;也解析了其中的原因。主要原因是因为SimpleDateFormat转换日期是通…

基于mysql搭建框架环境搭建_Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境

项目建设完成之后的结构&#xff1a;数据库的表结构如下&#xff1a;环境建设&#xff1a;搭建Maven环境、Tomcat环境、需要MySql 数据库支持&#xff0c;使用的编程工具Eclipse (这些是前期准备)&#xff1b;开始创建工程&#xff1a;1.创建一个Maven工程&#xff1a;选择weba…