当前位置:网站首页>了解 AQS 底层原理
了解 AQS 底层原理
2022-07-29 12:55:00 【何以解忧,唯有..】
一、AQS 介绍
AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。
AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器, 比如我们提到的 ReentrantLock,Semaphore,其他的诸如 ReentrantReadWriteLock,SynchronousQueue,FutureTask(jdk1.7) 等等皆是基于 AQS 的。当然,我们自己也能利用 AQS 非常轻松容易地构造出符合我们自己需求的同步器。
二、ReentrantLock 加锁和解锁的底层原理
AQS 内部有一个核心变量 —— state,是int类型,代表了加锁的状态,初始状态下,这个值为 0,另外还有一个关键变量,用来记录当前加锁的是哪个线程,初始化状态下,为null。
加锁以后的原理图:接着线程1来调用ReentrantLock 的 lock() 方法尝试进行加锁,这个加锁过程就是用CAS操作将 state 值从0变成1,一旦线程1加锁成功,就可以设置当前加锁线程是自己。

state: 所有线程通过通过CAS尝试给state设值,当state>0时表示被线程占用;同一个线程多次获取state,会叠加state的值,从而实现了可重入;
exclusiveOwnerThread: 在独占模式下该属性会用到,当线程尝试以独占模式成功给state设值,该线程会把自己设置到exclusiveOwnerThread变量中,表明当前的state被当前线程独占了;
CLH队列(FIFO —— 等待队列(同步队列): 等待队列中存放了所有争夺state失败的线程,是一个双向链表结构。state被某一个线程占用之后,其他线程会进入等待队列;一旦state被释放(state=0),则释放state的线程会唤醒等待队列中的线程继续尝试cas设值state;
head: 指向等待队列的头节点,延迟初始化,除了初始化之外,只能通过setHead方法进行修改;
tail: 指向等待队列的队尾,延迟初始化,只能通过enq方法修改tail,该方法主要是往队列后面添加等待节点。
三、ReentrantLock 公平锁和非公平锁原理
非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢锁,如果这个时候恰巧锁没有被占用,那么直接就获取锁返回,
非公平锁在 CAS 失败后,和公平锁一样都会进到 tryAcquire 方法,在tryAcquire 方法中,如果发现锁这个时候被释放了(state == 0),非公平锁会直接CAS抢锁,但是公平锁会判断等待队列是否有线程处于等待状态,如果有则不去抢锁,排队到队列后面。
边栏推荐
- mysql根据多字段分组——group by带两个或多个参数
- Sql file import database - nanny level tutorial
- SIP系统组成格式
- Research on the thinking and application methods of the frontier of ESI research
- 连接oracle数据库指令
- 人脸合成效果媲美StyleGAN,而它是个自编码器
- Nacos hierarchical storage model - the cluster configuration and NacosRule load balance
- Go-Excelize API源码阅读(七)—— CopySheet(from, to int)
- 基于对象的实时空间音频渲染丨Dev for Dev 专栏
- MySQL基础篇(四)-- 数据表的基本操作
猜你喜欢

【kaggle】Spaceship Titanic - 预测哪些乘客被运送到另一个维度【CatBoost - 10%】

Sentinel 2A data preprocessing and calculation of six common vegetation indices in snap software

DVWA全级别通关教程

为什么用了大牌工具后报表开发依然头痛

String.split()最详细源码解读及注意事项

开关电源-半桥LLC控制
![[网鼎杯 2020 半决赛]AliceWebsite](/img/59/5b87c1ce83adc4027efe8fff5d39ef.png)
[网鼎杯 2020 半决赛]AliceWebsite

【云原生】-Docker容器迁移Oracle到MySQL
Go简单实现协程池

投资127亿!深圳,再添一所985
随机推荐
What should I do if the webpage is hijacked and redirected?Release net repair method
Dataset:Medical Data and Hospital Readmissions医疗数据和医院再入院情况数据集的简介、下载、使用方法之详细攻略
大一(下)暑假作业
别再问我如何制作甘特图了!
JS_删除数组里的无效数据 0 undefined ‘‘ null false NaN
【C语言】扫雷游戏实现(初阶)
DVWA full level customs clearance tutorial
Container is changed | deploy MySQL cluster in the Rancher
2022年编程语言排名,官方数据来了,让人大开眼界
IDEA 数据库插件Database Navigator 插件
ISME | 沈其荣团队韦中组-土壤生物障碍发生的根际微生物组诊断
MySQL基础篇(三)-- 数据类型
Mysql stored procedures, rounding
【c ++ primer 笔记】第6章 函数
Nacos分级存储模型-集群配置与NacosRule负载均衡
Meta,元宇宙和广告双败的一季
BGP联邦综合实验
mariadbackup物理备份使用——筑梦之路
Bika LIMS 开源LIMS集—— SENAITE的使用(用户、角色、部门)
Windows系统Mysql8版本的安装教程