并发编程J.U.C之AQS剖析
一、j.u.c简介
在说主题AQS之前,我们有必要先来说一下J.U.C
顾名思义J.U.C就是java.util.concurrent,java并发工具包。由我们的并发大师老爷子Doug Lea亲自操刀完成。而在这个包里,包含了我们大名鼎鼎的Lock、ConrurrentHashMap、CountDownLatch、Executor、LinkedBlockingQueue、ThreadPoolExecutor等重要的处理并发的类或者接口。当然,这些只是我听说过的一些。(此处应该有一个笑哭的表情),后续我将会带大家一一解读这些重要的并发工具。
废话不多说,让我们一步一步剥丝抽茧,解开AQS的神秘面纱。
二、AQS
1.AQS概要
AQS,全程AbstractQueuedSynchronizer--抽象队列同步器,他诞生于JDK1.5,是java中关于线程、同步的基础组件。如果对原文感兴趣的话,可以参见大师的原文:J.U.C Synchronizer Framework。既然作为基础组件,那么它便存在了大量的应用场景。
1.1 AQS应用场景
在此处,我们以可重入锁ReentrantLock来举例,说明AQS的内在原理。ReentrantLock关系类图如下:

package com.jarluo.AQS; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* @desc AQS应用场景之可冲入锁ReentrantLock
* @author jar luo
* @time 2019.5.21
*/
public class ReentrantLockDemo { static Lock lock = new ReentrantLock(); public static void main(String[] args) {
lock.lock();
try {
System.out.println("AQS应用场景之可冲入锁ReentrantLock");
} finally {
lock.unlock();
}
}
}
AQS应用场景
从上面的代码,我们可以看出,AQS应用起来还是很简单的,但是我们从关系类图中可以看到在ReentrantLock中维护了一个Sync内部类,同时Sync有两个子类,分别是NonFairSync和FairSync。此处我们主要对NonFairSync进行追踪(FairSync更加简单一些),可以得到以下时序图:
通过观察AQS源码发现,AQS 包含了以下几种核心技术点:
1.1 state
1.2 cas原子方法
1.3 自旋锁
1.4 CLH变种队列
沿着volitile状态管理-CAS原子操作-自旋锁-CLH队列进行展开
2.锁的基本要素
2.1 一个共享的数据来记录状态
二、Lock
0.synchronized和ReentrantLock的区别
1.关键字、一个是J.U.C
2.释放
局限性:不够灵活,锁释放要么执行完,要么出异常。
1.Lock是什么
1.1Lock是一个interface。
1.2Lock 提供了获得锁和释放锁的方法

2.重入锁
2.1 ReentrantLock 重入互斥锁--表示可以重新进入的锁。
2.1.1唯一实现了Lock接口的一个类。
lock.lock(),增加重入次数
synchronized也支持重入。
代码示例:
2.1.2 当多个线程竞争锁的时候,其他线程怎么办?
阻塞
2.2 ReentrantReadWriteLock --重入读写锁
读->读 是共享的
读->写 互斥
写->写 互斥
适用场景:读多写少的场景。
代码示例:
三、AQS--抽象队列同步器
1.概念:同步工具
2.功能:
2.1独占->互斥
2.2共享->读读
3.基本实现:
用双向链表去维护等待获得锁的线程对象
Node节点 上节点 下节点 线程
状态(state):锁标记
0是无锁状态
>=1是有锁状态(表示可以重入)
4.CAS
偏移量 cas(obj,offset,expect,update)
乐观锁
本地方法:
四、Sync
1.非公平锁--NonfairSync
允许插队
2.公平锁--FairSync
不允许插队
五、关系图
时序图
并发编程J.U.C之AQS剖析的更多相关文章
- 【死磕Java并发】-----J.U.C之AQS:CLH同步队列
此篇博客全部源代码均来自JDK 1.8 在上篇博客[死磕Java并发]-–J.U.C之AQS:AQS简单介绍中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列. CLH同步队列是一个F ...
- java并发编程笔记(六)——AQS
java并发编程笔记(六)--AQS 使用了Node实现FIFO(first in first out)队列,可以用于构建锁或者其他同步装置的基础框架 利用了一个int类型表示状态 使用方法是继承 子 ...
- java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock
原文:java并发编程 | 锁详解:AQS,Lock,ReentrantLock,ReentrantReadWriteLock 锁 锁是用来控制多个线程访问共享资源的方式,java中可以使用synch ...
- JAVA并发编程J.U.C学习总结
前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的. 有错误也欢迎指正,大家共同进步: 另外,转载请注明链接,写篇文章不容易啊,http://www. ...
- 并发编程(十):AQS
AQS全称为AbstractQueuedSynchronizer,是并发容器中的同步器,AQS是J.U.C的核心,它是抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类都 ...
- 【死磕Java并发】—–J.U.C之AQS(一篇就够了)
[隐藏目录] 1 独占式 1.1 独占式同步状态获取 1.2 独占式获取响应中断 1.3 独占式超时获取 1.4 独占式同步状态释放 2 共享式 2.1 共享式同步状态获取 2.2 共享式同步状态释放 ...
- 【漫画】JAVA并发编程 J.U.C Lock包之ReentrantLock互斥锁
在如何解决原子性问题的最后,我们卖了个关子,互斥锁不仅仅只有synchronized关键字,还可以用什么来实现呢? J.U.C包中还提供了一个叫做Locks的包,我好歹英语过了四级,听名字我就能马上大 ...
- Java并发编程3-抽象同步队列AQS详解
AQS是AtractQueuedSynchronizer(队列同步器)的简写,是用来构建锁或其他同步组件的基础框架.主要通过一个int类型的state来表示同步状态,内部有一个FIFO的同步队列来实现 ...
- Java并发编程-深入Java同步器AQS原理与应用-线程锁必备知识点
并发编程中我们常会看到AQS这个词,很多朋友都不知道是什么东东,博主经过翻阅一些资料终于了解了,直接进入主题. 简单介绍 AQS是AbstractQueuedSynchronizer类的缩写,这个不用 ...
随机推荐
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-03 高级篇幅之Ribbon负载均衡源码分析实战
笔记 3.高级篇幅之Ribbon负载均衡源码分析实战 简介: 讲解ribbon服务间调用负载均衡源码分析 1.完善下单接口 2.分析@LoadBalanced ...
- MATLAB学习(十)实现文件、图像读写
t=1:5; s1=sin(t); s2=cos(t); s=[t;s1;s2]; fid1=fopen('test.dat','wt'); fprintf(fid1,'\nThis is a For ...
- Python list、tuple、dict区别
Dictionary 是 Python 的内置数据类型之一, 它定义了键和值之间一对一的关系. 每一个元素都是一个 key-value 对, 整个元素集合用大括号括起来 您可以通过 key 来引用其值 ...
- 测试ssh转发
端口转发提供: 1.加密 SSH Client 端至 SSH Server 端之间的通讯数据. 2.突破防火墙的限制完成一些之前无法建立的 TCP 连接. 但是只能转发tcp连接,想要转发UDP,需要 ...
- linux硬件驱动
今天被问到了一个新问题:linux需不需要安装驱动,就像windows装完系统之后需要安装最新驱动一样? 说实话以前真没想过,都是装完系统update一下就直接用了. 谷歌了一下,发现其实也是需要安装 ...
- centos 自动挂载ISO
创建挂载点并挂载光盘mkdir -p /media/cdrommount -t iso9660 -o loop /usr/ison/centos.iso /media/cdrom 设置开机自动挂载:方 ...
- openstack——Rabbitmq集群部署
一.前期准备 1.条件:准备3台Linux系统虚拟机,保持系统版本一致,确保配置好yum源,及网络源 2.3台虚拟机做静态解析 [root@yun1 ~]# cat /etc/hosts 12 ...
- 【miscellaneous】海康威视监控摄像头实现web端无插件监控实拍效果
[rtsp]海康威视监控摄像头实现web端无插件监控实拍效果 详细介绍参见:http://live.cuplayer.com/RtspCameraLive.html web端无须装插件(支持PC,安卓 ...
- web - code/flash
trace 来源: 1. http://traces.cs.umass.edu/index.php/Storage/Storage 源代码: 1.sourceforge 2.github.github ...
- Linux正则表达式题型
1.将下面的/etc/passwd所有行的第一列和最后一列相互调换位置. 解答: 1)使用sed的后向引用 2)awk -F ":" '{print $7":" ...