Java 并发总结——AQS

一、AQS

Java并发包(JUC)中提供了很多并发工具,ReentrangLock、Semaphore、CountDownLatch,它们的实现都用到了一个共同的基类——AbstractQueuedSynchronizer,简称AQS。

AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等皆是基于AQS的

二、基本实现原理

AQS维护一个共享资源state,通过内置的FIFO来完成获取资源线程的排队工作。该队列由一个一个的Node结点组成,每个Node结点维护一个prev引用和next引用,分别指向自己的前驱和后继结点,双端双向链表。

private volatile int state;//共享变量,使用volatile修饰保证线程可见性

状态信息通过procted类型的getState,setState,compareAndSetState进行操作

三、AQS两种同步方式

独占式、共享式

独占式如ReentrantLock

共享式如Semaphore,CountDownLatch,

组合式的如ReentrantReadWriteLock

(1)独占式
acquire
a.首先tryAcquire获取同步状态,成功则直接返回;否则,进入下一环节;
b.线程获取同步状态失败,就构造一个结点,加入同步队列中,这个过程要保证线程安全;
c.加入队列中的结点线程进入自旋状态,若是老二结点(即前驱结点为头结点),才有机会尝试去获取同步状态;否则,当其前驱结点的状态为SIGNAL,线程便可安心休息,进入阻塞状态,直到被中断或者被前驱结点唤醒。
release
release的同步状态相对简单,需要找到头结点的后继结点进行唤醒,若后继结点为空或处于CANCEL状态,从后向前遍历找寻一个正常的结点,唤醒其对应线程。

(2)共享式
共享式地获取同步状态,同步状态的方法tryAcquireShared返回值为int。
a.当返回值大于0时,表示获取同步状态成功,同时还有剩余同步状态可供其他线程获取;
b.当返回值等于0时,表示获取同步状态成功,但没有可用同步状态了;
c.当返回值小于0时,表示获取同步状态失败。

(3)模板方法模式
 protected boolean tryAcquire(int arg) : 独占式获取同步状态,试着获取,成功返回true,反之为false
 protected boolean tryRelease(int arg) :独占式释放同步状态,等待中的其他线程此时将有机会获取到同步状态;
 protected int tryAcquireShared(int arg) :共享式获取同步状态,返回值大于等于0,代表获取成功;反之获取失败;
 protected boolean tryReleaseShared(int arg) :共享式释放同步状态,成功为true,失败为false
(5)双向链表Node节点的状态
CANCELLED,值为1,表示当前的线程被取消;
SIGNAL,值为-1,表示当前节点的后继节点包含的线程需要运行,也就是unpark;
CONDITION,值为-2,表示当前节点在等待condition,也就是在condition队列中;
PROPAGATE,值为-3,表示当前场景下后续的acquireShared能够得以执行;
值为0,表示当前节点在sync队列中,等待着获取锁。

(6)AQS实现公平锁和非公平锁
非公平锁中,那些尝试获取锁且尚未进入等待队列的线程会和等待队列head结点的线程发生竞争。

公平锁中,在获取锁时,增加了isFirst(current)判断,当且仅当,等待队列为空或当前线程是等待队列的头结点时,才可尝试获取锁。

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

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

相关文章

P4427-[BJOI2018]求和【LCA】

正题 题目大意:https://www.luogu.org/problem/P4427 题目大意 一棵树,每次给一条路径,求路径上每个点的深度的kkk次方的和。 解题思路 路径上分成两条深度连续的链,所以我们可以先预处理出kkk次方的前缀和。 然后LCALCALCA就好了。 code…

C#中DateTime的缺陷与代替品DateTimeOffset

C#中的DateTime在逻辑上有个非常严重的缺陷:> var d DateTime.Now;> var d2 d.ToUniversalTime();> d d2false> d.Equals(d2);false在C#交互模式中输入以上代码,可以发现尽管一个是本地时间(d),一个是U…

Java SSL与TLS客户端证书配置

一、TLS安全概念 (1)PKI PKI是 Public Key Infrastructure的简称,意思是公钥基础设施。 公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。通过证书和秘钥来确认通讯双方是否可信任。 &#x…

P3901-数列找不同【模拟】

正题 题目链接:https://www.luogu.org/problem/P3901 题目大意 一个序列AAA&#xff0c;每次询问一个区间求这个区间的数是否各不相同。 解题思路 用lastilast_ilasti​表示前一个与iii相同数的位置。 然后Lastimax{lastj}(j<i)Last_imax\{last_j\}(j<i)Lasti​max{la…

Java RSA私钥的格式pkcs1和pkcs8、PrivateKey转换

&#xff08;&#xff09;一、私钥格式 &#xff08;1&#xff09;pkcs1 格式&#xff1a; -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- &#xff08;2&#xff09;pkcs8 格式&#xff1a; -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KE…

重磅消息-Service Fabric 正式开源

微软的Azure Service Fabric的官方博客在2017.3.24日发布了一篇博客 Service Fabric .NET SDK goes open source &#xff0c;介绍了社区呼声最高的Service Fabric开源的情况以及当前的情况&#xff0c;当时开源了Service Fabric的.NET SDK部分&#xff0c;社区一直在期盼着Ser…

Java 证书pem转KeyStore、jks文件

一、服务端pem转KeyStore CertificateFactory certificateFactory CertificateFactory.getInstance("X.509");FileInputStream caInputStream new FileInputStream(caPath);List<X509Certificate> caList certificateFactory.generateCertificates(caInput…

牛客国庆集训派对day6T A- 2016【矩阵乘法】

正题 题目链接:https://ac.nowcoder.com/acm/contest/1111/A 题目大意 2∗22*22∗2的矩阵AAA&#xff0c;求AnA^nAn 解题思路 我们将其十进制的转化过来&#xff0c;如 A2016(A103)2∗(A10)∗(A)6A^{2016}(A^{10^3})^2*(A^{10})*(A)^6A2016(A103)2∗(A10)∗(A)6 这样时间复杂…

.NET Core 配置Configuration杂谈

前言.NET Core 在配置文件的操作上相对于.NET Framework做了不少改变&#xff0c;今天来聊一聊。关于Configuration的Package都是以Microsoft.Extensions.Configuration开头的支持多种方式的配置&#xff0c;包括内存、Json文件、XML文件等等&#xff0c;今天我们主要用Json格式…

Java Jenkins Api

一、Maven <dependency><groupId>com.cdancy</groupId><artifactId>jenkins-rest</artifactId><version>0.0.20</version> </dependency> github地址&#xff1a;https://github.com/cdancy/jenkins-rest 如果需要最新的代…

秘密:从程序员到领导者的微妙之处

读到一篇关于程序员、领导力和领导者的好文章&#xff0c;翻译过来分享下。借用一句文中的话&#xff1a;“好吧&#xff0c;我只是个程序员&#xff0c;为什么需要领导&#xff1f;” &#xff0c;读完你就知道了。做一个优秀的领导者可能不是大部分程序员会立即认同的东西。许…

牛客国庆集训派对day6TJ-DefenseTower【贪心】

正题 题目链接:https://ac.nowcoder.com/acm/contest/1111/J 题目大意 一棵树&#xff0c;每个点有一个威力值&#xff0c;每次破坏一个点会受到与它相连没有破坏的点的威力值之和的伤害。求破坏所有点的最小伤害。 解题思路 因为是一棵树&#xff0c;所有我们可以看为每条边…

K8S Learning(1)——简介

一、Kubernetes kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器——Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是一组服务…

老衣的微服务实践简要指引2017版

这是老衣在2017年5月份总结的&#xff0c;适用于中小团队跨平台微服务开发的实践指引&#xff08;简化版&#xff09;。若有有不当之处&#xff0c;欢迎指点更正因本文涉及到大量第三方库或工具&#xff0c;详细学习和了解需要参考相关官方文档。若您在使用Mac电脑&#xff0c;…

P2052-[NOI2011]道路修建【树】

正题 题目链接:https://www.luogu.org/problem/P2052 题目大意 一棵树&#xff0c;一条边的价值是长度乘上两端点的数量差。求所有边的边权之和。 解题思路 统计子树大小就可以知道两端的数量差了。 codecodecode #include<cstdio> #include<cstring> #include…

K8S Learning(2)——集群环境搭建

一、部署Kubernetes 集群 有两种方式&#xff1a; &#xff08;1&#xff09;kubeadm Kubeadm 是一个K8s 部署工具&#xff0c;提供kubeadm init 和kubeadm join&#xff0c;用于快速部署Kubernetes 集群。 官方地址&#xff1a;Kubeadm | Kubernetes &#xff08;2&#…

P2796-Facer的程序【dp】

正题 题目大意:https://www.luogu.org/problem/P2796 题目大意 求一棵树中有多少个子树。 解题思路 考虑dpdpdp。 fif_ifi​表示已iii这个点为根的子树个数。 动态转移方程fx∏x−>y(fy1)f_x\prod_{x->y}(f_y1)fx​x−>y∏​(fy​1) 答案就是∑i1nfi\sum_{i1}^nf_…

K8S Learning(3)——资源管理

一、资源 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 kubernetes的本质上就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;所谓的部署服务&#xff0c;其实就是在kubernetes集群中运行一个个…

Entity Framework Core 之数据库迁移

前言最近打算用.NET Core写一份开源的简易CMS系统,来练练手所以又去深入研究了一下Entity Framework Core 发现其实有些细节园子里还是很少讲到.特意整理了几个细节.正文1.数据库迁移先了解一下什么是"数据库迁移",它提供了一种方法&#xff0c;可以逐步将Code First…

A Boring Game

题面&#xff1a;Jeff has got 2n2n real numbers a1,a2,…,a2na1, a2, …, a2n. He decides to adjust the numbers. Namely, Jeff consecutively executes nn operations, each of them goes as follows:choose indexes ii and jj (i≠ji ≠ j) that havent been chosen…