Java多线程系列(十):源码剖析AQS的实现原理

在并发编程领域,AQS号称是并发同步组件的基石,很多并发同步组件都是基于AQS实现,所以想掌握好高并发编程,你需要掌握好AQS。

本篇主要通过对AQS的实现原理、数据模型、资源共享方式、获取锁的过程,让你对AQS的整体设计有清晰了解,让你迈出高并发编程的第一步。

AQS

AQS(AbstractQueuedSynchronizer)就是一个抽象的队列同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它。

AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,比如大家熟知的:

  • ReentrantLock
  • Semaphore
  • CountDownLatch
  • CyclicBarrier

等并发类均是基于AQS来实现的。

AQS的数据模型

Java多线程系列(十):源码剖析AQS的实现原理

AQS 使用上图的资源变量 state来表示同步状态,通过内置的 CLH FIFO 队列来完成获取资源线程的排队工作,这里会涉及到三个要素:

1.AQS的三个核心成员变量

Java多线程系列(十):源码剖析AQS的实现原理
  • 共享资源:volatile int state(代表共享状态)
  • 队头节点:head头节点
  • 队尾节点:tail尾节点

head、tail、state三个变量都是volatile的,通过volatile来保证共享变量的可见性。

2.AQS中state状态的变更是基于CAS实现的

主要有三种方法:

  • getState()
  • setState()
  • compareAndSetState()
Java多线程系列(十):源码剖析AQS的实现原理

state状态通过volatile保证共享变量的可见性,再由CAS 对该同步状态进行原子操作,从而保证原子性和可见性。

3.CLH队列(FIFO队列)

CLH队列通过内置的FIFO队列(Node来实现),来完成线程等待排队 (多线程争用资源被阻塞时会进入此队列)。

AQS资源共享方式

AQS定义两种资源共享方式:

Java多线程系列(十):源码剖析AQS的实现原理

1.独占锁Exclusive

独占模式下时,其他线程试图获取该锁将无法取得成功,只有一个线程能执行,如ReentrantLock采用独占模式。

ReentrantLock还可以分为公平锁和非公平锁:

  • 公平锁:按照线程在队列中的排队顺序,先到者先拿到锁
  • 非公平锁:当线程要获取锁时,无视队列顺序直接去抢锁,谁抢到就是谁的

2.共享锁shared

多个线程获取某个锁可能会获得成功,多个线程可同时执行,如:Semaphore、CountDownLatch。

AQS的锁获取与释放原理

Java多线程系列(十):源码剖析AQS的实现原理

1.线程获取锁流程:

  • 线程A获取锁,state将0置为1,线程A占用
  • 在A没有释放锁期间,线程B也来获取锁,线程B获取state为1,表示线程被占用,线程B创建Node节点放入队尾(tail),并且阻塞线程B
  • 同理线程C获取state为1,表示线程被占用,线程C创建Node节点,放入队尾,且阻塞线程

2.线程释放锁流程:

  • 线程A执行完,将state从1置为0
  • 唤醒下一个Node B线程节点,然后再删除线程A节点
  • 线程B占用,获取state状态位,执行完后唤醒下一个节点 Node C,再删除线程B节点

更加详细的锁获取和释放过程,建议通过查看源码的方式学习AQS独占模式和共享模式下的获取锁过程。

AQS总结

本文主要介绍AQS的数据模型、CLH队列、资源共享方式、以及锁的获取与释放流程,来介绍AQS的实现原理

让大家能对AQS有一个整体的了解,只有对整体的设计方向有清晰了解,再去跟踪学习源码就会比较轻松了。

后续将详细介绍基于AQS实现的同步组件:ReentrantLock、Semaphore、CountDownLatch。

更多高并发编程系列,请查看:

高并发编程系列:NIO、BIO、AIO的区别,及NIO的应用和框架选型

高并发编程系列:ConcurrentHashMap的实现原理(JDK1.7和JDK1.8)

高并发编程系列:CountDownLatch、Semaphore等4大并发工具类详解

高并发编程系列:并发容器的原理,7大并发容器详解、及使用场景

高并发编程系列:4种常用Java线程锁的特点,性能比较、使用场景

Java并发编程系列:Java线程池的使用方式,核心运行原理、以及注意事项


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

玩转二算法课的笔记-第一章

1 问题:对一组数据进行排序 回答:快速排序算法o(NLOGN),错误。 关键词:思考 应该问面试官,这组数据有什么样的特征? 比如;有没有可能包含大量重复的元素? 如果有这个可能的话,三路快…

微软亚洲研究院NLC组招聘实习生!与一线研究员共探NLP前沿与落地!

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术MSRA-NLC组招人啦!微软亚洲研究院(MSRA)自然语言计算组(NLC)招收长期实习生一名,与一线研究员共同进行自然语言处理领域的科研项目和落地…

分治应用--万里挑一 找假硬币

文章目录1. 问题描述2. 解题思路3. 代码实现1. 问题描述 n 个硬币中有1枚是假币,真假币唯一的区别是假币重量轻,如何快速找出假币 2. 解题思路 暴力做法,一个一个的称重,O(n)复杂度分治思路 将硬币等分…

Java多线程与并发系列从0到1全部合集,强烈建议收藏!

在过去的时间中,我写过Java多线程与并发的整个系列。 为了方便大家的阅读,也为了让知识更系统化,这里我单独把Java多线程与并发的整个系列一并罗列于此,希望对有用的人有用,也希望能帮助到更多的人。 以下为整个目录&a…

论文浅尝 | 基于图注意力的常识对话生成

OpenKG 祝各位读者新春快乐,猪年吉祥!来源:IJCAI 2018.论文下载地址:https://www.ijcai.org/proceedings/2018/0643.pdf项目源码地址:https://github.com/tuxchow/ccm动机在以前的工作中,对话生成的信息源是…

Facebook、阿里等大佬现身说法,NLP是否被高估了?

NLP (自然语言处理),利用计算机对人类的语言文字进行处理。由于语言文字是人类交流沟通的最基本方式,因此 NLP 也是最典型的 AI 领域之一。NLP 被誉为“人工智能皇冠上的明珠”。这话也许没错,但听起来难免空洞。所以我去实际问了3位从事 NLP…

玩转算法面试-第二章

1 时间复杂度分析 正常处理的数据规模,为了保险起见,可将将上面的数在除以10,防止电脑假死。 空间复杂度分析: 注意问题:递归调用是有空间代价的 3 常见的复杂度分析 翻转的代码: 选择排序的方法&a…

论文笔记(Attentive Recurrent Social Recommendation)

注意力循环社交推荐 原文链接:Attentive Recurrent Social Recommendation, SIGIR’18 原理:将用户的朋友和历史交互项按时间划分,用注意力机制整合各个时段的朋友影响和交互项影响后输入LSTM来学习动态用户向量,动态用户向量与动…

回溯算法(Backtracking Algorithm)之八皇后问题

文章目录1. 回溯算法思想2. 算法应用2.1 八皇后问题1. 回溯算法思想 前面讲过贪心算法并不能保证得到最优解,那怎么得到最优解呢? 回溯思想,有点类似枚举搜索。枚举所有的解,找到满足期望的解。为了有规律地枚举所有可能的解&am…

最全Java锁详解:独享锁/共享锁+公平锁/非公平锁+乐观锁/悲观锁

在Java并发场景中,会涉及到各种各样的锁,比如:高并发编程系列:4种常用Java线程锁的特点,性能比较、使用场景,这些锁有对应的种类:公平锁,乐观锁,悲观锁等等,这…

论文浅尝 | Generative QA: Learning to Answer the Whole Question

链接: https://openreview.net/forum?idBkx0RjA9tX传统的机器阅读理解的模型都是给定 context 和 question, 找出最有可能回答该 question 的 answer,用概率表示为 p(a|q,c),这其实是一个判别模型。判别模型在大多数任务上可以取得比生成模型更好的准确…

打破BERT天花板:11种花式炼丹术刷爆NLP分类SOTA!

星标/置顶小屋,带你解锁最萌最前沿的NLP、搜索与推荐技术文 | JayLou娄杰编 | 小轶在2020这个时间节点,对于NLP分类任务,我们的关注重点早已不再是如何构造模型、拘泥于分类模型长什么样子了。如同CV领域当前的重点一样,我们更应该…

论文笔记(A Neural Influence Diffusion Model for Social Recommendation)

神经影响传播模型为了社交推荐 原文链接:A Neural Influence Diffusion Model for Social Recommendation, SIGIR’19 原理:社交网络上应用GNN提取朋友对用户的影响候选项对用户历史交互项的注意力影响用户向量,用户向量和项向量的内积预测评…

玩转算法面试-第三章

数组中常见的问题 排序: 选择排序;插入排序;归并排序;快速排序 查找:二分查找法 数据结构:栈;队列;堆 … 二分查找法: 1964年提出,没有bug的二分查找法是在1…

回溯应用-- 0-1背包问题

文章目录1. 问题描述2. 回溯解决思路1. 问题描述 0-1背包非常经典,很多场景都可以抽象成这个问题。经典解法是动态规划,回溯简单但没有那么高效。 有一个背包,背包总的承载重量是 W kg。现有n个物品,每个物品重量不等&#xff0…

Java多线程系列(五):线程池的实现原理、优点与风险、以及四种线程池实现

为什么需要线程池 我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口。但是我们创建这两种线程在运行结束后都会被虚拟机销毁,如果线程数量多的话,频繁…

论文浅尝 | 面向单关系事实问题的中文问答模型

来源:NLPCC 2017论文下载地址:http://tcci.ccf.org.cn/conference/2017/papers/2003.pdf动机开放领域的QA问题是一个被广泛研究的问题,而且目前这个问题并没有被很好地解决。在中文领域,相关的数据集并不多。而NLPCC开放了一个KBQ…

玩转算法值面试-第五章 -在链表中穿针引线

5-123 数组中可以随机访问,相反链表就不行 leetcode:206 反转一个链表,链表如果没有特别声明,则节点的值不发生改变 一共需要三个指针:current指向当前需要处理的指针 next指向当前需要处理的元素的下一个元素的指针…

论文笔记(SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation)

一个有效的基于图卷积神经网络的社交推荐模型 原文链接:SocialGCN: An Efficient Graph Convolutional Network based Model for Social Recommendation, arxiv 原理:在用户-项交互图上应用GNN来学习用户向量的表示,用户向量和项向量内积预测…

POJ 1753 Flip Game(回溯)

文章目录1. 题目1.1 题目链接1.2 题目大意1.3 解题思路2. 代码2.1 Wrong Answer代码2.2 Accepted代码1. 题目 1.1 题目链接 http://poj.org/problem?id1753 1.2 题目大意 一个黑白棋子的棋盘,一个反过来周围四个也跟着反过来(如果存在的话),颜色取反…