对于AQS的理解
1、JUC包中的 CountDownLatch、CyclicBarrier、ReentrantLock和Semaphore都是基于AQS(AbstractQuenedSynchronizer)实现的
在ReentrantLoc这个组件里,state表示获取锁的线程数,假如state=0,表示还没有线程获取锁,1表示有线程获取了锁。大于1表示重入锁的数量。
继承:子类通过继承并通过实现它的方法管理其状态(acquire和release方法操纵状态)。
可以同时实现排它锁和共享锁模式(独占、共享),站在一个使用者的角度,AQS的功能主要分为两类:独占和共享。它的所有子类中,要么实现并使用了它的独占功能的api,要么使用了共享锁的功能,而不会同时使用两套api,即便是最有名的子类ReentrantReadWriteLock也是通过两个内部类读锁和写锁分别实现了两套api来实现的
2、AQS底层实现了一个FIFO的队列。底层的数据结构是一个双向链表;
3、AQS核心思想
如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
4、CLH队列(FIFO)
CLH队列是一个虚拟队列,没有队列实例只有节点与节点之间的关系。
AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成获取资源线程的排队工作。AQS使用CAS对该同步状态进行原子操作实现对其值的修改。
当一个线程尝试获取锁失败后,就会把失败信息封装成一个node节点尝试加入这个同步队列。因为可能有多个线程都想加入队列尾部,所以加入队列是采用了cas + volatile。
加入队列后获取锁的操作:队列里面的节点会观察pre节点即前置节点的状态,如果是不是头结点就会阻塞,如果前面一个节点是头结点就会被唤醒一直循环尝试获取锁。
5、VarHandle
varHandle是jdk9之后加入的,handle的意思是句柄,VARHandle指的就是引用变量指向具体对象的那个引用
varHandle可以直接给变量赋值,并且做一些原子操作
public class Demo {
int x = 10;
private static VarHandle varHandle; static {
try {
varHandle = MethodHandles.lookup().findVarHandle(Demo.class, "x", int.class);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
Demo demo = new Demo(); //获取变量值
System.out.println((int)varHandle.get(demo)); //为变量赋值
varHandle.set(demo, 1);
System.out.println(demo.x); //进行原子操作
varHandle.getAndAdd(demo,3);
System.out.println(demo.x);
}
}
对于AQS的理解的更多相关文章
- AQS简单理解入门---1
这篇文章,我们来聊聊面试时一个比较有杀伤力的问题:聊聊你对AQS的理解? 之前有同学反馈,去互联网公司面试,面试官聊到并发时就问到了这个问题.当时那位同学内心估计受到了一万点伤害... 因为首先,很多 ...
- 聊聊你对AQS的理解
场景引入 面试官上来就一句,谈谈你对AQS的理解,大家心里可能收到了1W点伤害,AQS是什么,可能连全称都不知道,所以下面让我们聊聊AQS. 以ReentrantLock来介绍一下AQS 在java中 ...
- 【面试普通人VS高手系列】谈谈你对AQS的理解
AQS是AbstractQueuedSynchronizer的简称,是并发编程中比较核心的组件. 在很多大厂的面试中,面试官对于并发编程的考核要求相对较高,简单来说,如果你不懂并发编程,那么你很难通过 ...
- Java并发面试问题,谈谈你对AQS的理解
本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...
- 并发系列3-大白话聊聊Java并发面试问题之谈谈你对AQS的理解?【石杉的架构笔记】
- java并发:AQS的简单理解
简介: AQS全称 AbstractQueuedSynchronizer,提供了一个基于FIFO(先进先出)队列,可以用于构建锁或者其他相关同步装置的基础框架. ReentrantLock.Semap ...
- AQS源码的简单理解
概念 AQS全称 AbstractQueuedSynchronizer. AQS是一个并发包的基础组件,用来实现各种锁,各种同步组件的.它包含了state变量.加锁线程.等待队列等并发中的核心组件. ...
- 从ReentrantLock实现非公平锁的源码理解AQS中的CLH队列
虽然前面也看过AQS的文章,并且转载过一篇大佬的分析,但是我觉得他们对于AQS和ReentrantLock部分的源码的分析并不详细,自己理解期来还是有问题,于是自己准备花时间重新梳理下,好了,进入正题 ...
- 加深对AQS原理的理解示例一:实现一个独占锁
/** *@Desc * 这个自定义的独占锁 只是一个简单的版本,非常粗糙,只为了加深对AQS原理理解.但还有一些列问题有待解决,比如锁的重入,锁不允许被其他线程中断等! *@Author zhang ...
随机推荐
- sentinel控制台与应用通信原理
1,应用程序配置中的port选项用于指定在应用端启动的http server的端口,默认8719 sentinel: transport: dashboard: localhost:8080 port ...
- Oracl Linux KVM虚拟机备份
Oracle Linux KVM 作为Oracle Linux的一部分,基于KVM的Oracle Linux 服务器虚拟化解决方案在功能上得到了增强.用户可以利用Oracle Linux旧版本,将操 ...
- js逻辑程序
JavaScript 是 Web 的编程语言. 所有现代的 HTML 页面都使用 JavaScript. JavaScript 非常容易学. 本教程将教你学习从初级到高级 JavaScript 知识. ...
- uniapp swiper高度自适应问题
这里的话是想做一个比较常见的左右滑动更改tab的效果,引用了uview-ui中的u-tabs-swiper组件,需要结合swiper组件来使用 先来讲下主体思路:每个tab页(swiper-item) ...
- JWT实现过程及应用
jwt实现过程 # 用户登录,返回给客户端token(服务端不保存),用户带着token,服务端拿到token再校验; 1,提交用户名和密码给服务端,如果登陆成功,jwt会创建一个token,并返回; ...
- C# NModbus RTU通信实现
Modbus协议时应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络/串口和其它设备之间可以进行通信.它已经成为了一种工业标准.有了这个通信协议,不同的厂商生成的控制设备就可 ...
- model基础操作(上)
1.创建表 https://www.cnblogs.com/xiaonq/p/7978409.html 1.1 Meta源信息 from django.db import models c ...
- python重要第三方库pandas加载数据(详解)
Pandas数据加载 关注公众号"轻松学编程"了解更多. pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,其中read_csv和read_table这两个 ...
- 从小白到 6 个 offer,我究竟是怎么刷题的?
最近自习室里又兴起了一阵刷题潮,大家相约刷题~ 今天和大家系统分享下我去年转行时的一个刷题过程和方法,希望对你有所帮助. 首先介绍下我的编程基础,我学的是金融工程专业,硕士时学过 C++ 的课,这也是 ...
- JDK8中的新时间API:Duration Period和ChronoUnit介绍
目录 简介 Duration Period ChronoUnit 简介 在JDK8中,引入了三个非常有用的时间相关的API:Duration,Period和ChronoUnit. 他们都是用来对时间进 ...