AQS核心原理之

news2024/9/21 14:37:08

AQS系列

1、AQS核心原理之
2、ReentrantLock 原理及示例

文章目录

  • AQS系列
  • 一、什么是AQS?
  • 二、AQS特性
  • 三、AQS内部维护 state
  • 四、队列
    • 4.1 同步等待队列
    • 4.2 条件等待队列
    • 5、总结

一、什么是AQS?

AQS全称是 AbstractQueuedSynchronizer(抽象对了同步器),是一个抽象类,在 juc(java.util.concurrent) 包下面,Java 并发编程核心都在这个包下面,大多数同步器实现都是围绕着共同的基础行为,比如说:等待队列、条件队列、独占获取、共享队列等,而这个行为就是基于 AbstractQueuedSynchronizer 实现,AQS是定义了一套多线程访问共享资源的同步器框架,也是一个依赖于状态(state)的同步器。

二、AQS特性

  • 阻塞等待队列:AQS内部是通过一个 Node 类来组成一个队列,不管是条件队列还是CLH等待队列。
  • 共享 / 独占:在 Node 类中定义 共享模式、独占模式;独占模式下只有一个线程能执行,比如 ReentrantLock, 共享模式下多个线程同时执行,比如 Semaphore、CountDownLatch。
  • 公平 / 非公平:可以设置公平竞争资源还是非公平。
  • 可重入:因为是通过 state 标记状态的,可以重复加锁。
  • 允许中断:AQS 中判断当前线程是否是中断状态。

三、AQS内部维护 state

前面说过,AQS 内部其实就是靠一个属性成员 state 来维护状态的,state 的定义是这样的 volatile int state,是通过 volatile 修饰的,确保状态的改变每个线程都可以及时感知到 state 值的变化;
state 表示资源的可用状态,提供了三种访问方式:

  • getState():获取状态的值,如果是 0 则资源可用。
  • setState():设置状态值,相当于加锁。
  • compareAndSetState():比较替换,原子操作。

四、队列

4.1 同步等待队列

AQS 中的同步等待队列也称 CLH 队列,CLH 队列是 Craig、Landing、Hagersten 三人发明的基于双向链表结构的队列,是 FIFO(先入先出)等待队列。
CLH队列

4.2 条件等待队列

Condition 是一个多线程间协调通信的工具类,在某个或者某些线程一起等待某个条件成立,只有该条件成立是则这些线程才被唤醒重新争夺锁。
条件队列
原理流程图

5、总结

AQSDoug Lea 写出来的,基于 state 状态 和 队列的一个多线程框架,很多实现都是基于 AQS 实现的,比如说 ReentrantLock 是一个独占方式执行,每次只有一个线程执行,还有 SemaphoreCountDownLatch 都是 共享的方式执行,每次有多个线程同时执行,我在做数据推送的工作是总喜欢用它们,效率杠杠的。
这篇文章简单介绍了 AQS 原理,至于源码后面慢慢看,确实逻辑很复杂也能难懂,先学会使用再看源码吧。

昨天还是 2022-12-31,今天是 2023-01-01,大家新年快乐 ^ _ ^ !!!

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

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

相关文章

Cento6从零开始用Nginx+mysql+php搭建Discuz在线论坛系统

首先我的liunx使用版本是 centos6.5 32位 discuz版本是Discuz_X3.2_SC_UTF8.zip Xshell版本是6 xftp是7版本 mysql也是是这个版本:mysql这里写目录标题1.yum安装php2.安装nginx包3.安装php-fpm4.安装php-mysql5. 安装Discuz在线论坛系统由于目前yum源已经无法使用需…

力扣 2037. 使每位学生都有座位的最少移动次数

题目 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示。给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数组 students ,其中 students[j] 是第 j 位学生的位置。 你可以执行以下操作任…

unidbg案例-爱库存app之sig和sign分析

新年的第一篇文章,新的一年继续加油,奥利给!冲冲冲。 今天分析的app是爱库存,版本号6.1.6,这次还是使用unidbg分析该样本,加密参数有很多,不过只关注sig和sign两个参数。 老规矩,上来先抓个包。 1.抓包 可以看到上面👆🏻的sign,就是本次研究的重点。 2.jadx静…

A* 算法详解(超级详细讲解,附有大图)

目录 引入 一.基本概念 二.算法原理 ①用宽度优先搜索 ②狄克斯特拉算法 ③A*算法 三.需要注意 四.c伪代码 最后 引入 今天想跟大家聊的,是我们经常用到,但是却让大家觉得十分神秘的那个算法:A* 。 这是一个远古而又非常经典的游戏…

【C++ STL】-- 用一棵红黑树的插入实现同时封装map与set

用一棵红黑树同时封装map与set的意义:所谓的 “用一棵红黑树同时封装map与set” 只是在程序员的角度,通过一系列手段,以一个红黑树同时满足map与set。但是在编译器的角度,实际上并不是一颗树实现的,程序员所写的只是一…

机器学习 10:激活函数大全

虽称为激活函数大全,但也不敢太过自满,如有遗漏与错误,还请指正 文章目录线性激活函数Sigmoid 函数LogSigmoidSwishTanh / 双曲正切激活函数TanhShrinkSoftsignReLU 函数BReLULeaky ReLUPReLURReLUELUSELUCELUGELUSoftmax 函数Maxout 函数Sof…

Android 实现多语言

工具下载连接 链接:https://pan.baidu.com/s/1Wq9DTzhP2fkHXLEbOQFr9A?pwdlmcz 提取码:lmcz 1.将你需要的翻译的strings放到exe目录下 2.双击执行xml转xls.exe 英文 日文 韩文(使用空格分割)回车,会在当前目录下生…

jvm学习的开端(一)----类的加载(类加载子系统)

文章目录1.Loading(加载阶段)2.Linking(链接阶段)2.lnitialization(初始化阶段)来自 百度百科: 类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的…

【java项目】飞机大战

文章目录项目-飞机大战窗口的创建背景图片的添加/点击事件的启动游戏物体父类的编写背景的移动双缓存技术--解决文字闪动背景图片循环出现我方战斗机的添加和鼠标控制添加首颗子弹批量添加子弹敌方飞机的批量添加功能我方子弹与敌方飞机的碰撞检测我方子弹与敌方飞机碰撞时的处…

单片机基础之单片机中断、定时器中断、PWM及SG90舵机的初识认知

目录 一、初探单片机中断 二、定时器中断相关寄存器 1、中断寄存器 2、中断结构 3、用定时器中断方式控制LED,代码编程测试 三、初识PWM 1、什么是占空比 2、如何输出PWM信号 四、SG90舵机基本认知 1、什么是舵机 2、怎么控制舵机 3、舵机编程实战 一、…

Jetson nano 入手系列之2—板载摄像头IMX219启动

Jetson nano 入手系列之2—板载摄像头IMX219启动1.亚克力板安装2.摄像头启动3.nvgstcapture常用命令3.1 Set sensor orientation3.2 Get Image Capture Resolution3.3 Capture3.4 quit参考文献Jetson nano 入手系列: Jetson nano 入手系列之1—如何SSH远程登录 Jets…

Redis学习(一)

Redis入门 Redis是一个基于内存的key-value结构数据库,读写性能较高 Redis数据类型 Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种数据类型: 1.字符串 string 2.哈希 hash 3.列表 list 4.集合 set 5.有序集…

Altium Designer 20 凡亿教育视频学习-01

课程视频:第1课 课程介绍.mp4_哔哩哔哩_bilibili 第一部分学习 学习方法 工程具备文件 一定需要先建立工程,再来创建原理图库、原理图等文件 栅格大小改变 栅格的大小我们常在绘制原理图的时候改变,因为有时候我们需要画一个细线&#…

【PCB专题】什么是通孔、盲孔、埋孔?

PCB板是由基板和PP叠加而成的。不同层上走了各种信号线和电源,这些信号和电源在不同的电路层之间切换时需要依靠过孔(通孔、盲孔和埋孔)连接。如下图所示的6层板,使用了2阶HDI方案:有机械孔和激光孔。 过孔的作用就像是水管一样,连接了不同的平面。PCB板上的过孔作用就是…

函数的定义和调用 与 this指向

1、函数的定义和调用 1.1、函数的定义方式 函数声明方式 function 关键字 (命名函数)函数表达式 (匿名函数)new Function() var fn new Function(参数1,参数2..., 函数体)(1)Function 里面参数都必须是字符串格式 (2)第三种方式…

已解决+ CategoryInfo: SecurityError: (:) [ ].ParentContainsErrorRecordException

已解决无法加载文件 E:\day_01\Scripts\activate.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的about_Execution_Policies。 CategoryInfo: SecurityError: (:) [ ]…

[LeetCode周赛复盘] 第 326 场周赛20230101

[LeetCode周赛复盘] 第 326 场周赛20230101 一、本周周赛总结二、 [Easy] 6278. 统计能整除数字的位数1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6279. 数组乘积中的不同质因数数目1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6196. 将字符串分割成值不超过 K 的子字…

路由 NAT(简介、静态NAT、动态NAT、NATServer、NAPT、Easy-ip、NAT地址映射表)

4.1.0 路由 NAT(简介、静态NAT、动态NAT、NATServer、NAPT、Easy-ip、NAT地址映射表) 目录简介NAT地址映射表静态NAT简介操作案例动态NAT简介操作案例NAT Server简介操作案例NAPT简介操作案例Easy-ip简介操作案例简介 为了有效节约公网IPv4地址&#xf…

QT 学习笔记(十二)

文章目录一、文件系统1. 文件系统简介2. 文件系统分类二、基本文件操作1. QFile 读文件2. QFile 写文件3. QFileInfo 获取文件信息三、基本文件操作代码1. 主窗口头文件 widget.h2. 主窗口源文件 widget.cpp由于每次代码都是在原有程序上修改,因此除了新建项目&…

物联网与射频识别技术,课程实验(三)

实验3—— 时隙ALOHA(S-ALOHA)算法的实现及其性能分析 实验说明: 1. 利用Python或Matlab模拟时隙ALOHA算法; 分析标签数量k、时隙大小t对信道利用率的影响,其中, 信道利用率发送数据的时间/(发送数据的时间信道空闲的时间) 3. …