00:00
好,同学们,那么到这儿我们的AQS的源码深度解读算式告一段落,怎么样?我相信如果你只要跟着杨哥这样跟下来,呃,我自己觉得啊,应该是内功会有这么一点点提升。好,那接下来。严格学习说过这个小口诀,三板斧理论实操小总结,那么接下来呢,还要辛苦一下同学们,我们最后花一点点时间把全部的aqs从理论到源码。再给大家串一下,那么梳理一下我们刚才的流程,那务必请同学们按照我布置的家庭作业,今天晚上回去呢,跟一下OK,这些你听一遍,就是你现在脑子懂了,你手根本就不懂,你还是要动手动手再动手,OK那么好。接下来我们简简单单的复习一下。那么之前哈。前期的铺垫理论呢,听着比较枯燥,那么这个时候如果你跟的下来了以后,烦请你再把这段话再认认真真的读一遍,再看看这个队列,结合我们的这个,那么请同学们理解一下什么叫抽象的队列同步器,那么同学们读完以后,你第一次读和我带着你读过源码,走过全部流程以后,学过一遍以后,你来读,我认为你不会再觉得这些是啰嗦,这些是废话了吧,那么再来看这么一个状态,也知道什么是叫state,也知道这些什么东东了吧,为什么叫头,什么叫尾。
01:31
OK,那么再请问,现在我们看看aqs同步队列的基本结构,再看这张图,我相信你也就明白到底我讲的是什么意思了吧。哎,所以说呢,希望你能够。完整的跟下来。你不要只听到一半就放弃了,或者说讲些什么呀。不懂,抱歉,不是我在为难大家,现在你要去阿里巴巴应聘P6和P7这样的拿月薪25000,年薪30万以上的程序员。
02:01
可以这么说,这些内功是你必须要具备的,大厂的面试官,人家不是等闲之辈,每天的工作都可能要面试啊,就像我那些大厂的。老同事啊,老朋友直接也说了,说哎,现在啊,来了以后没几个能够过跟我们过一两招的,都是一些背题,根本根本就不懂,我们需要刷题,我们不背题,我没有说整总结成一个word文档。把aqs变成语文课发给大家,同学们你们去背,我相信我们通过这样源码的逐行深度解析,用这样动态的动画片一样的流程走通了,给大家梳理清楚,你才能够真正的掌握。OK,好,那么下面耽误各位同学最后一点点时间,我们来做一下最后的什么全系列的总结,把我们刚才讲的全部的流程。我们认认真真的再过一遍,过一遍,把我们的主要流程回顾一下,那么今天晚上大家复习的时候,就一定要跟着自己的节奏来走一下,不许偷懒,要动手动手再动手。
03:12
讲过了,扫帚不到,灰尘不会自己跑掉,好,那么同学们。下面呢,我们呢来看看啊。首先我们呢,以。非公平所得的lock,这个lock方法作为突破口,来彻底明白我们的AQS的队列同步器,它是怎么把这些排队线程纳入管理,然后等待唤醒通知,挨个该上位的上位,该出队的出队,那么这个时候我们走走刚才我们的流程。软的洛的洛方法,其实底层调用的是C这个类,OKOK吧,你用户级别的API级别调的是洛,而底层走的是s lock,那么这儿又是一个抽象的方法,公平锁还是非公平锁,我们本次啊,我们在代码里面写过,我们这个案例走的是不是就是我们的非公平所,所以我们把主干流程走一遍,再带着大家串一下,复习一下资料发给大家,晚上就按照杨哥的这个流程图,希望你可以自己。
04:16
跟一遍源代码,自己总结成自己的笔记,这个是杨哥的,不是你的,OK,跟着我走。那么下面这个方法有印象吧,比较并设置状态值啊,我当然希望这个窗口没有人了。如果是这样的话,我去占用,把这个标志位设为一,那么是不是就是我们这的变成一。OK吧,否则的话我们就要acquire尝尝试着去争强所那么我们走的是非公平,通过CS这个获取,那么我们前面讲过,不管是公平还是非公平,最终是吧,如果是我们讲了一个非公平的多这么一步,公平和非公平都会走到AC块re这个方法,那么我们现在走非公平这个分支啊,如果说你获得锁了出好说,那么直接上位,相当于说这个设置成你当前占用节点完活,否则的话是force,我们就会走到我们的AC块re方法,Acquire方法,那么acquire方法。
05:14
什么是不是即使底层是尝试获取锁,如果获取不到排队,那么要阻塞当前的线程,那么大家请看这个方法,这个方法整体这个方法是不是就这三个方法的互动啊,那么往下。我们先来走第一个try acquire,如果是错A,说明抢到了,表示获得了锁线程,逐级返回加锁过程就结束,但是我们刚才说过是吧,我们故意让A线程一直持续占用,那么我们肯定是抢不到,我们整个流程走下来都是按照模拟抢索不顺利要去排队,那么所以说这是force,那么force,我们这个是force整体是不是返回处,然后往前走,是不是要走我们的。准备把我们的线程B。
06:00
加到这个队列,OK吧,那么慢慢的排队来进行,那么走起,我们到第二个方法,艾那走过来,这儿是执行我们的排队逻辑了,好的,那么在这块呢,艾德维塔。过来,那么这边我们先走的是二,一定要注意。B线程先走的是二,那么它的意思呢?是将当前线程封装成node对象,不多废话了,并加入排队队列当中,那么首先执行一二的不同逻辑处啊。如果走二是表示排队队列为空,需要执行队列的什么初始化,所以说我们先走的是二,这个1NQ这个方法没问题吧,那么同学们,我们呢,快快的过一遍,我也知道大家已经是疲惫了,那么现在呢?En q,这个方法过来。接下来我们走这个值啊。执行上图的第二步。没有其他线程在排队,调用EQ构造队列,并将node加入到队列当中,然后最终的结果是不是返回node,那么这个en q方法我们前面讲过了,是不是主要是给大家说明什么是叫哨兵节点,我们是不是强调过就must初始化,那么这是个自学,那么各种过来这儿尿node没问题吧,也就是我们之前讲的是不是第一次的这个哨兵灰色这个节点,好,它只要是它主要是站位,没有什么数据。aqs有两个属性,头指针和尾指针,分别用来保存AKS队列的头尾节点,初始化的时候,这两个属性都是,那当有一个线程排队,那么这个时候你懂的,这个粉红色的在这儿,我这张图上这个啊,就是我们的哨兵节点,OK,那么最终。
07:40
B线程的话,就是前面是一个灰色的哨兵节点,后面才是这个真正的B,那么跑到这儿,我们接下来的话呢。该有的注释我的节约时间就不带着大家读了,我们全部的流程都详细的讲解过,那么在这是不是就返回我们的noe了,这是执行我们的第二步EQ方法,那么但是我们的C节点进来就是第三个顾客进来以后,这由于这个已经不等于烂了,听到那么他呢,就表示排队队列已经不为空了,C线程进来就是第三个顾客,C顾客进来的时候,G之前已经初始挂初始化好了,我们的AKS同步队列器里面这个队列已经有哨兵节点和B节点了,此时只需要将新的node节点加入排队的队尾即可,那么所以说我们到这儿。
08:26
它呢,由于里面已经排好队了,先走二,B节点是走RC节点是走一,因为已经有B构建好了。傀儡节点和B节点自身我们这个队列不为空了,所以说初二执行上图的步骤,一,队列已经初始化,将C节点加入到队列的对位,然后放到最后即可返回我们这个node排队的状态,那么现在我们就变成这个是哨屏节点,这个是我们的B节点,这个就是我们的C节点,那么他们呢,就形成了这个队列排队,OK,那么走起,那么接下来呢,我们呢,继续艾这个方法完成了,那么看看我们的圆码。
09:05
TRY是第一个,艾德准备入队,排队着第三一个,是不是尝试在队列里面再抢抢,那么走起,我们这儿说过了。它返回表示线程获取到锁,线程逐级返回,加锁过程结束,那么所谓的加锁是最终坐稳了,我们是不是要执行这个帕克逻辑啊,那么好,同学们。我们走到这儿,我们一再的强调这是个自选,那么这个是我们的头节点,头节点不为空,然后B跟C都会执行,再强强刚才我们的正常流程走下来,是不是都说过都是force force了以后不进这个if,是不是走这个树的park after fair acquire执行抢占失败了以后走这个流程,那么这个是我们的一个注释,那么大家呢,我就不再读了,跟着我来,那么然后我们说是首先走的是这个方法,那么这个方法进来了以后。我们大家请看走的又是这一个方法,那么这些处false判断第一次啊,那不好意思啊,干嘛都不走第一次,我们是不是走的是把这个哨边节点的值从零初始值换成负1C是不是通知啊,说明我们这个B要。
10:17
开始进来了,这个方法接收两个参数,OK吧,那么最终是要让它稳稳当当的落地做进来,那么全部的流程我们呢,都给大家讲解过,你看这是不是复习返回first,那么返回first了以后,我们前面说过了,如果在这段返回force第二次自学,人家是不是又来了,那么又走上面这个还是抢不到么?接下来说是park and check interrupt,我们就要走这个分支啊,那再次循环判断,那么我们这儿帕克线程进入阻塞状态,那么在这儿我们的B是不是就一直卡在这个aqs队列里面,直到。A,调用安洛克方法帮我唤醒,那么这样释放出这个锁臂的上位啊,好,那么整体同学们,那么这边呢,是我们。
11:09
也和这边的话一样,是我们加锁啊,只不过是这个公平锁这边的一个分支,其实呢,基本上都是一样的,好,那么同学们资料发给大家,请同学们按照着杨哥这个流程,你全部。源码通读一遍,只有这样你的内功才能提起来,就避免自己成为API调用工程师。都清楚,就一个洛克,安洛克就这么一个调用,显示出什么水平啊,那么它底层的源码。都不让你写,能不能读懂大神写的源码是什么?如果你读懂的同学,那么这也应该明白什么叫双向链表,你再去学数据结构,是不是感觉就很轻松了?好,那么同学们粗略的带大家过了一遍,那么时间的关系很多需要大家是需要下去下苦功夫去自我消化提升的,一定要功夫到家,好,那么请同学们务必拿下aqs,那么这一家就给大家介绍到这儿。
我来说两句