探索AQS源码的奥秘
什么是AQS
AQS:AbstractQueuedSynchronizer ,它是一个 抽象的同步队列器 ,这个类位于 java .util.concurrent.locks 包下面,是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石,通过内置的FIFO队列来完成资源获取线程的排队工作,并通过一个int类型变量麦示持有锁的状态。
主要是通过CLH队列实现对线程的调度。
CLH: Craig、Landin and Hagersten队列,是一个单向链表,AQS中的队列是CLH变体的虚拟双向队列FIFO。 AQS如何实现锁
AQS使用一个volatile的int类型的成员变量来表示同步状态,通过内置的FIFO队列来完成资源获取的排队工作将每条要去抢占资源的线程封装成一个Node节点来实现锁的分配,通过CAS完成对State值的修改。
node :排队获取锁的线程都会生成一个node节点存储在队列里面
state : 当前锁的占用状态 为1的是时候表示当前锁被占用
head : 指向队列的头节点,头节点是一个空节点
tail :指向队列的尾节点
下面整个AQS类的继承结构
ReentrantLock
通过ReentrantLock通过debug来看AQS的源码
1:创建两个线程
通过wait变量来控制线程是否占用锁,
通过两个t1,t2,演示对锁lock的获取过程。
2:开始debug
t1开始尝试获取锁,可以看到队列中empty的,没有线程在等待获取锁,此时state=0 表示当前锁没有被占用。
在206行,尝试通过CAS获取锁。
通过逻辑可以知道t1一定可以获取到锁的,获取成功后,把当前 exclusiveOwnerThread 设置为当前线程。t2获取锁
同理,t1占用线程并没有释放锁,此时的state=1的,通过cas获取失败。代码进入到 acquire 方法中。
继续看acquire方法中的逻辑
这个if语句中有三个 方法,先看 try Acquire 方法
这个方法所作的工作就是尝试获取锁,大致逻辑就是 state 没有被占用,尝试获取锁,如果锁是被占用的,判断当前获取锁的线程和占有所得线程是不是同一个线程,是的话增加获取锁的计数器,如果超过最大值久抛出异常。
这里锁是被占用的,所以返回的false。
接下执行方法 addWaiter
看前面的方法注释,我们也知道这个方法主要就是创建当前线程的Node的节点,同时加入队列中。
可以看到因为当前队列是空的,只有一个t1持有锁,t2在尝试获取锁。队列是空的情况像,会执行 enq
方法。这个方法会创建一个空的 傀儡节点 。
这个方法的话就是把傀儡节点插入队列中,同时维护头尾指针。
接下来就是执行 acquireQueued 这个方法了。debug进去看看。
接下来如图;
接下来执行的是 shouldParkAfterFailedAcquire 这个方法,这是方法是AQS的核心。
这个参数一个是当前节点的前节点,一个是当前节点。现在节点的前节点是空的傀儡节点。
前接节点的的 waitStatus 的值为0,所以进入了如图的方法,目的就是修改前节点的值为-1,也就是SIGNAL状态
修改成功后,继续循环。
这个时候 ws 变成了-1 了返回true
接下来进入
这个方法
就是要当前线程阻塞在这里,安安静静的等待,等待被唤醒。
现在就卡在这里不动了。
那什么时候唤醒呢? 线程唤醒
被阻塞在队列中的线程什么时候被唤醒呢?这个需要当前持有锁的线程,解锁的时候唤醒。
获得头节点的下一个节点线程,执行 uppark 操作
这里之前被阻塞的线程被唤醒了
然后继续循环继续抢锁
这里自然就可以抢到锁了。然后把当前节点设置为头节点。
世界上所有的相遇都是一种ampampquot恩赐生活中,没有无缘无故的相遇。无论遇见谁,无论是早是晚,无论结局是好是坏,都一定会带给你一些东西。漫漫征途中,有人传递温暖,有人引领你前行,有人教会你成长,有人让你被爱。俗话说,锦上
大地作物和人类1hr昨天,正是农历的十二节气之中的立冬。天气其实并不好,阴沉沉的,早上还下了雨,无论是街道还是地里都还保持着水迹。我站在初冬的田野里,呼吸着青草和干草堆散发的混乱气息,放在我脚下
房地产史诗级救市,房价还会涨吗?不给穷人希望了?最近,央行和银保监会发布重磅救市措施,通过16条举措,全方位向房地产市场输血,被业界称之为史诗级救市。这一次救市,会给房地产市场带来怎样的影响呢?由于房地产市场持续降温,去年以来,
年轻小伙为2亿财产,攀上79岁新加坡富婆警惕温情骗局!前段时间新加坡联合早报报道,被指侵占新加坡富婆4000万新币(约2亿元人民币)家产,闹到满城风雨的中国籍前导游杨寅,刑满出狱后被驱逐出境,终生不能踏入新加坡境内。这个
2022年最后2轮油价调整时间已定,油价有望暴跌,重回7元2022年最后2轮油价调整时间已定,油价有望暴跌,重回7元新一轮国内成品油于(下周一)晚24时正式开启调价窗口,截止目前仅剩最后1个工作日,结合前9个工作日油价预计下调幅度,每吨汽
这30个身边现象,让我感到不可思议作者水木然1在银行工作的朋友的脾气越来越差(社会资金的流转出现困难)2媒体(尤其是自媒体)上的广告越来越没有品位了(为了生存放低门槛)3高速公路上车流量,尤其是货车流量减少了(社会
妩媚多情,芬芳馥郁妩媚多情,芬芳馥郁头条作者云开日初妩媚多情性感美,芬芳馥郁娇燕飞。上苍赐予仙女貌,楚楚动人如花蕊。美貌娇艳的美女子,个个妩媚多情多姿又不失性感,芬芳馥郁香气袭人,甜美的姿态如飞翔的
月凉花谢,人去楼空旧时,素颜云鬓红袖,水边柳绿衫相伴,恬静温润的水墨画卷润泽了谁的眼眶,清脆悦耳的低吟打动了谁的心醉。当悲欢离合,谁满身灾难,在往事的身影中为自己寻求解脱。泪水一湿,伤痕成茧,眼里的
记一次处理Dubbo多网卡注册IP错误问题场景介绍今天在docker上部署服务时,启动都很成功,但是访问时却访问失败。之前在本地启动在测试服k8s上启动都很正常,为什么同样的代码同样的docker镜像在docker上却有问
印在心底的梦花记得小时候,爷爷门槛下的路边,种了棵梦花树,印象中它开着泛黄黄的花朵,隔着好远都能闻到花香,若是凑近了闻一哈会把你熏昏倒,味道很是浓烈不曾记得它长叶子的模样,记忆深处是冷冷的季节,
如果有一天,你爱的人不爱你了,记住这三点,你就赢了两个人决定在一起时,想的是永远。而分开的时候,剩下的只有决绝。相信很多人在面对失败的感情时,都很难做到干脆利落,相爱的点点滴滴萦绕在心头,也不是想忘就能忘的。但感情这种事,分分合合