并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍
文章目录
- J.U.C脑图
- J.U.C核心AQS简介
- AQS底层数据结构
- AQS特点
J.U.C脑图
为了体现出AQS和线程池的重要性,上图单独将AQS和线程池拿出来了。
J.U.C的构成如下:
J.U.C核心AQS简介
并发编程-14线程安全策略之并发容器(J.U.C)中的集合类中介绍了J.U.C中的Collections集合 ,这篇博文我们将继续来看下J.U.C中的 AQS抽象队列同步器
AQS(AbstractQueuedSynchronizer)是并发容器中的同步器,AQS是J.U.C的核心,它是抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,我们常用的ReentrantLock、Semaphore、CyclicBarrier、ReentrantLock、Condition、FutureTask都依赖于该抽象类等。
AQS底层数据结构
如上图,AbstractQueuedSynchronizer底层数据结构是一个双向链表,是队列的一种实现
- Sync queue:同步队列,其中head节点主要负责后面的调度
- Condition queue:单向链表,不是必须的,只有程序中使用到Condition的时候才会存在,可能会有多个Condition queue
AQS特点
AQS维护了一个volatile int state和一个使用Node实现的FIFO线程等待队列
使用Node实现FIFO队列,可以用于构建锁或者其他同步装置的基础框架
利用一个int类型state表示获取锁的线程数(0没有线程获取锁,1有线程获取锁,大于1表示重入锁的数量)) ,AQS提供了三种访问方式:
setState()
getState()
compareAndSetState()
这三种操作均是原子操作,其中compareAndSetState
的实现依赖于Unsafe
的compareAndSwapInt()
方法使用方法是继承,然后复写AQS中的方法,基于模板方法模式
子类通过继承并通过实现它的方法(acquire和release)管理其状态
可以同时实现排它锁(独占,只有一个线程能执行,如ReentrantLock)和共享锁模式(共享,多个线程可同时执行,如Semaphore/CountDownLatch). 一般情况下,子类只需要根据需求实现其中一种模式,当然也有同时实现两种模式的同步类,如ReadWriteLock
自定义同步器实现时主要实现以下几种方法:
protected boolean isHeldExclusively() // 该线程是否正在独占资源。只有用到condition才需要去实现它。
protected boolean tryAcquire(int) // 独占方式。尝试获取资源,成功则返回true,失败则返回false。
protected boolean tryRelease(int) // 独占方式。尝试释放资源,成功则返回true,失败则返回false。
protected int tryAcquireShared(int) // 共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
protected boolean tryReleaseShared(int) // 共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。
关于AQS源码解读,请移步 https://www.cnblogs.com/waterystone/p/4920797.html
接下来我们就针对AQS中的同步组件逐一通过示例来演示
- CountDownLatch
- Semaphore
- CyclicBarrier
- ReentrantLock
- Condition
- FutureTask(非AQS的组件)
并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍相关推荐
- 并发——抽象队列同步器AQS的实现原理
一.前言 这段时间在研究Java并发相关的内容,一段时间下来算是小有收获了.ReentrantLock是Java并发中的重要部分,所以也是我的首要研究对象,在学习它的过程中,我发现它是基于抽象队列同步 ...
- 【转】Java并发编程:并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...
- 学习笔记:Java 并发编程⑥_并发工具_JUC
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
Java并发编程:并发容器之CopyOnWriteArrayList(转载) 原文链接: http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW ...
- 【檀越剑指大厂--并发编程】并发编程总结
并发编程 一.并发基础 1.什么是并行和并发? 并行,表示两个线程同时(同一时间)做事情. 并发,表示一会做这个事情,一会做另一个事情,存在着调度. 单核 CPU 不可能存在并行(微观上). 2.什么 ...
- 【Java并发编程】并发编程大合集
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...
- 并发编程——JUC并发编程知识脑图
摘要 并发编程在软件编程中尤为突出和重要,在当今面试或工作中也是不可缺少的.作为一名高级java开发工程师,并发编程的技能已经成为了重要的一项.本博文将详细介绍并发编程中的知识点和知识脑图,帮助大家更 ...
- Java并发编程之AbstractQueuedSychronizer(抽象队列同步器,简称AQS)
AbstractQueuedSychronizer(抽象队列同步器,简称AQS): JDK的并发包(包名:java.util.concurrent,以下简称JUC)下面提供了很多并发操作的工具类,如: ...
- Java并发编程:同步容器
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器.并发容器.阻塞队列.Synchronizer(比如CountDownLatch).今天我们就来讨论下同步容器. ...
最新文章
- Android studio中出现Couldn't resolve resource @dimen/...
- 多媒体个人计算机的英语,计算机英语之网络多媒体篇
- BCH矿池新格局,Coingeek矿池曾成为BCH算力最大的矿池
- HBuilderX 连接电脑的模拟器问题
- Easy Problem 2 奇妙的数字
- 年龄计算、工作表合并、高级筛选(三)
- ALAssetsLibrary获取相册列表
- 隐藏apache版本号的方法
- POJ1256 (C++ compare函数)
- 洛谷P4135 作诗 --分块基础
- Otsu算法原理及实现
- hadoop搭建和指令
- 【python】打造一款自动扫描全网漏洞的扫描器
- 用c语言写一个文件加密程序,用C语言设计程序进行文件的加密
- 浏览器JSON的插件(JSON-handle)使用问题
- 计算机网络之数据链路层原理
- 威纶通触摸屏232脚位_威纶通触摸屏使用手册
- STM32的频率和占空比计算
- 搜索技术【启发式搜索】 - 简介 A* 算法 IDA*算法
- 计算机网络:移动IP
热门文章
- 计算机视觉编程——多视图几何
- 113. Leetcode 674. 最长连续递增序列 (动态规划-子序列问题)
- Leetcode 48. 旋转图像 (每日一题 20210813)
- 李宏毅线性代数笔记3:行列式det
- 生物计算论文笔记1:The construction of next-generationmatrices for compartmentalepidemic models
- 文巾解题 leetcode993. 二叉树的堂兄弟节点
- 阿里数据中台系列之Apsara Stack控制台初始化配置及资源管理(二)
- python 函数的*args,**kwargs
- view函数_数据科学系列:数据处理(6)字符串函数基于R(二)
- 深度学习100例 | 第28天:水果的识别与分类(准确率99.9%)