聊聊你对AQS的理解
场景引入
面试官上来就一句,谈谈你对AQS的理解,大家心里可能收到了1W点伤害,AQS是什么,可能连全称都不知道,所以下面让我们聊聊AQS。
以ReentrantLock来介绍一下AQS
在java中,用java并发包下的ReentrantLock来加锁和释放锁,是个什么样的感觉呢?
ReentrantLock lock=new ReentrantLock();
lock.lock();
try { }catch (Exception ex){ }
finally {
lock.unlock();
System.out.println("测试");
}
上面那段代码,无非就是一个锁的对象,然后加锁和释放锁。
你可能会问:这个和AQS有啥关系,关系大了去了,因为Java 并发包下,很多API都是基于AQS来实现加锁和释放锁的功能的,AQS是Java 并发包的基础。
AQS的全称是:AbstractQueuedSynchronizer,抽象队列同步器,给大家画一张图,看看,ReentrantLock和AQS的之间的关系。
    
ReentrantLock里面包含了一个AQS对象,这个AQS对象是ReentrantLock可以实现加锁和释放锁的关键性核心组件。
ReentrantLock加锁和释放锁的底层原理
如果一个线程尝试用ReentrantLock的lock方法来进行加锁,会发生什么事情呢?
这个AQS对象内部有一个核心变量叫做state,是int类型的并且还是volatile的,初始状态这个state的值是0。
另外AQS内部还有一个关键变量,用来记录当前加锁的是哪个线程,初始荒唐下这个变量是null。
    
接着线程1跑过来调用ReentrantLock的lock方法进行加锁,这个加锁的过程,直接就是将CAS的state从0变成1。
如果之前没加过锁,那么state值是0,此时线程1是可以加锁成功的。
一旦线程1,加锁成功之后,就把当前加锁线程设置为自己。下面这张图就是线程1的加锁过程。
其实看到这里,大家对AQS应是有感觉了的,就是并发包里面的一个核心组件,里面维护有state变量,加锁线程变量等核心东西,维护了加锁状态。
ReentrantLock这种东西只是也给外层的API,内核中的锁机制都是依赖AQS组件的。
除此之外,AQS内部还维护着一个先进先出的等待队列,因为如果线程2这个时候来加锁,就会加锁失败,所以AQS还有维护一个等待队列,专门来存放那些加锁失败的线程。
ReentrantLock是可重入锁,知道了state变量和当前加锁线程是谁之后,就可以很容易实现可重复进入的锁了。
如果线程1,在完成自己的业务逻辑代码之后,就会释放锁,他释放锁的过程非常简单,就是将AQS内的State变量的值递减1,如果state值为0,就彻底释放锁了,会将加锁线程也变为null。
这就是AQS的整个过程。
总结
AQS是一个并发包的基础组件,用来实现各种锁,各种同步组件,它包含state变量,加锁线程,等待队列等并发中的核心组件。
聊聊你对AQS的理解的更多相关文章
- AQS简单理解入门---1
		
这篇文章,我们来聊聊面试时一个比较有杀伤力的问题:聊聊你对AQS的理解? 之前有同学反馈,去互联网公司面试,面试官聊到并发时就问到了这个问题.当时那位同学内心估计受到了一万点伤害... 因为首先,很多 ...
 - 【面试普通人VS高手系列】谈谈你对AQS的理解
		
AQS是AbstractQueuedSynchronizer的简称,是并发编程中比较核心的组件. 在很多大厂的面试中,面试官对于并发编程的考核要求相对较高,简单来说,如果你不懂并发编程,那么你很难通过 ...
 - 并发系列3-大白话聊聊Java并发面试问题之谈谈你对AQS的理解?【石杉的架构笔记】
 - Java并发面试问题,谈谈你对AQS的理解
		
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
 - 对于AQS的理解
		
1.JUC包中的 CountDownLatch.CyclicBarrier.ReentrantLock和Semaphore都是基于AQS(AbstractQuenedSynchronizer)实现的 ...
 - 聊聊ReentrantLock基于AQS的公平锁和非公平锁的实现区别
		
ReentrantLock锁的实现是基于AQS实现的,所以先简单说下AQS: AQS是AbstractQueuedSynchronizer缩写,顾名思义:抽象的队列同步器,它是JUC里面许多同步工具类 ...
 - java并发:AQS的简单理解
		
简介: AQS全称 AbstractQueuedSynchronizer,提供了一个基于FIFO(先进先出)队列,可以用于构建锁或者其他相关同步装置的基础框架. ReentrantLock.Semap ...
 - AQS源码的简单理解
		
概念 AQS全称 AbstractQueuedSynchronizer. AQS是一个并发包的基础组件,用来实现各种锁,各种同步组件的.它包含了state变量.加锁线程.等待队列等并发中的核心组件. ...
 - 从ReentrantLock实现非公平锁的源码理解AQS中的CLH队列
		
虽然前面也看过AQS的文章,并且转载过一篇大佬的分析,但是我觉得他们对于AQS和ReentrantLock部分的源码的分析并不详细,自己理解期来还是有问题,于是自己准备花时间重新梳理下,好了,进入正题 ...
 
随机推荐
- 小程序循环时的item问题
			
平常在做小程序时,比如循环渲染数据时,如果有多个数据层次,一般都会这样 wx:for-item=item2,它的意思只是简单的起了一个wx:for循环值的别名,不是表示循环item2,index2同理 ...
 - 集合框架-ArrayList练习(去除ArrayList集合中的重复元素)
			
1 package cn.itcast.p3.arraylist.test; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; ...
 - ES入门三部曲:索引操作,映射操作,文档操作
			
ES入门三部曲:索引操作,映射操作,文档操作 一.索引操作 1.创建索引库 #语法 PUT /索引名称 { "settings": { "属性名": " ...
 - pycharm中操作git
			
pycharm操作git 1.找到VCS 2.
 - Linux 查看运行中进程的 umask
			
线上某台虚机因为故障重装了系统(基线 CentOS 6.9 内核 2.6.x),重新部署了应用.这个应用会生成一个文件,到NFS挂载目录. 而这个 NFS 挂载目录是一个 FTP 服务器的目录.另一台 ...
 - MyEclipse工程中Java Build Path中的JDK版本和Java Compiler Compiler compliance level的区别
			
感谢大佬:https://blog.csdn.net/shan9liang/article/details/17266519 问题起源: 今天再在ESB调用WebService测试,需要在jboss上 ...
 - 无脑安装——Python  及 安装python集成开发环境pycharm
			
无脑安装--Python 及安装python集成开发环境pycharm 1.真机安装python 2.安装python集成开发环境pycharm Python 是一种解释型语言 Python 是面向对 ...
 - YOLOv5模型训练及检测
			
一.为什么使用YOLOv5 二.软件工具 2.1 Anaconda https://www.anaconda.com/products/individual 2.2 PyCharm https://w ...
 - ABCD四个顺序执行方法,拓展性延申
			
今天在群里,有人问 有几个void返回值的方法,但是我想让这几个方法有执行顺序,要怎么处理,ABCD 四个方法,依次执行,但是这几个方法都是无返回值的 这个问题其实很简单,如果方法是同步方法,直接四个 ...
 - Pytest介绍
			
Pytest介绍 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高.根据pytest的官方网站介绍,它 ...