当前位置:网站首页>了解 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抢锁,但是公平锁会判断等待队列是否有线程处于等待状态,如果有则不去抢锁,排队到队列后面。
边栏推荐
- 微信小程序的登录
- JUC阻塞队列-ArrayBlockingQueue
- Container is changed | deploy MySQL cluster in the Rancher
- 超年轻!34岁教授,任985王牌学院副院长!
- Dataset:Medical Data and Hospital Readmissions医疗数据和医院再入院情况数据集的简介、下载、使用方法之详细攻略
- [based] GO language. Why do I have to learn Golang and introduction to the language universal
- 别再问我如何制作甘特图了!
- [Numpy] np.select
- Py之eli5:eli5库的简介、安装、使用方法之详细攻略
- MySql string splitting realizes the split function (field splitting, column switching, row switching)
猜你喜欢
随机推荐
hash table 实现代码
IO flow: node flow and process flow summarized in detail.
码蹄集 tourist
万字长文,揭秘华为数据治理体系!
MySQL database installation (detailed)
苹果手机用久了卡顿,学会这样清理缓存,清理后和新机一样流畅
Container is changed | deploy MySQL cluster in the Rancher
MySql string splitting realizes the split function (field splitting, column switching, row switching)
一起来侃个球
mysql5.7.35安装配置教程【超级详细安装教程】
Interceptors and filters (3) @interface custom annotation interception
Sql file import database - nanny level tutorial
Go-Excelize API源码阅读(七)—— CopySheet(from, to int)
传奇版本添加npc修改增加npc方法以及配置参数教程
Legendary version adds npc modification, adds npc method and configuration parameter tutorial
如何把Netflix数据集转换成Movielens格式?
传奇服务端GOM引擎和GEE引擎区别在哪里?
[Mysql] LENGTH函数
snap软件中哨兵2A数据预处理及六种常用植被指数的计算
【云原生】-Docker容器迁移Oracle到MySQL









