00:00
好,各位同学,我们继续来。通过前面的讲解我们已经清楚了,不管你是公平还是非公平,只要调度lock方法,其design都会找到这个acquire这个方法,那么船的参数是一,一就代表这个,这个状态从零变成一,有人抢锁成功占用好。那么acquire方法其实底子。都是try acquire adator和acquire的这三个方法的合并,那么接下来我们将带着大家抽丝剥茧,细致认真的,甚至是什么用动画给大家完成这个加锁、解锁、入队、出队、通知、唤醒等等的一系列aqs底层运作原理的相关细节来。那么首先啊。本次讲解呢,我们是走非公平锁。作为案例给大家进行突破,那么源码的解读呢比较困难,那么按照总分总的架构,后续杨哥的全系列脑图会给大家呢,做好这个笔记。那么下面。
01:08
植入主题源码走起来。首先。方法。那么来吧,弟兄们,我们都清楚,对于这个落口方法。是lock接口里面的,那么它的实现主要就是re lock,那么在这个里面我们大家呢,又清楚又分为公平还是非公平,那么先找到我们的什么非公平,来大家搂一下。继承了C考,那么再回到我们的公平了,继承了C考,那么对于洛克方法,大家请看,对于非公平而言,它呢,多了这么一个意思,对于公平而言,直接是A块啊,那么也就是说。现在一点开idea的高亮显示和快方法都是同一个,所以说最re的lock里面非公平的,公平的调这个lock方法。
02:07
非公平的会比公平的啰嗦一些,所以我们以这个麻烦的作为突破口,如果你把这个都搞懂了,非公平的,那么对于公平的就这么一行,你也肯定也就不在话下了,所以我们讲难的这个,第二个大家请看这是不是有个叫快啊,这是非公平的点开。大家请看。现在是不是三段。这个这个,然后又是这个,好,这是非公平跳进来的,那么公平呢,同学们请看这是公平的,也是A块跳进来呢,还是这个,哎,所以说。1R2 2r1的就是他们两个的代表都是一回事,所以说我们在这儿我们可以看到洛克方法对于非公平。那么假设第一个线程抢占compare and set,一看就是CS,不解释啊,希望值是零,如果OK说明什么?我是第一个线程,没有人来抢,那么我就把这个值从零改成一,并把当前持有资源占有所得设置为当前线程,那么后续,不好意思啊,如果第一个线程在使用着占着这个索呢?
03:15
这个卫生间有人用呢,不好意思啊,我只能是acquire,第二个线程及后续线程,我们去排队准备着后续的抢占,这是非公形,那么公形我们也看到了,它呢,只有这个acquire,好,那接下来我们就要来研究研究第二步,这个acquire。不再啰嗦,他们都是ER2R1的直接进来,那么直接进来以后,第一个方法叫acquire,第二个方法叫第三个方法叫acquire to的好,那么。我们呢,就来分析这个源码和三大流向的走向来,弟兄们。红色绿色蓝色123,那么所以说aqs的acquire方法主要有三条流程,三个分支啊,第一个先说try AC块,就是我准备去抢占,那么抢占的话先串串,如果能抢得到直接使用,抢不到你给我去排队或者再去争抢,那么来有a try acquire,以后在这儿请看。
04:13
来了啊,我们这儿呢,Aqs的啊和快二方法点开前面强调过了。设计模式里面的模板方法设计模式。顶层的as这个基础负类只留下了规范try acquire里面的实现,什么都没有。留给子类,但是你必须要给我实现了,那么在这儿点开以后大家请看。这是公平,这是非公平,如果你是公平,那么来,弟兄们前面强调过了,有这么一个方法是吧?看看这个队列里面,前面还有没有,如果说你是非公形的,那么来,我们也可以搂一眼。怎么着,Try AC块re,这是非公平的try AC块re点开,那么大家请看前面是不是有没有那个has那个方法,哎,所以说他们两个呢,很简单,OK,那么然后其基础代码就这么一点都一样好了,那么接下来它的意思就是说,如果你调用try a块这个方法,这个try acquire是负类aqs的,那么这有个throw new and support exception是负类的钩子方法必须往下走,如果是交由公平类子类实现,那么就是多这么一个has killed的。
05:24
Sister这么一个方法,如果是非公平,刚才大家也看到了,那么就是没有这个方法,OK,好,那么这是第一个分支啊,那么第二个分支啊,如果我强所失败,那么是不是叫艾德维塔加入到等待者队列,所以呢,各位同学。我们呢,回到这儿来。搁到这儿了,以后非公平为例。那么。来这个方法如果成功了,抢锁皆大欢喜,OK,你抢锁成功皆大欢喜过,如果没成功,你是不是得进入队列去排队啊,那么这里呢,就是艾维塔,那么艾德塔了以后,那么同学们请看这儿就有这么一段,待会我们会来解读,然后这有个en n q就说明什么入队,所以说呢,在分支这儿,那么第二个分支二就是什么。
06:15
初二是第一个分支,强索成功,皆大欢喜,强索不成功进入第二个分支,艾德维塔加入到排队的等待对立,然后以相关的业务逻辑,最终在这有个重要的叫en q。Enter q入队操作,那么就进来了对吧?那么所以说这一段该怎么着,我们后续聊,那么这一段就是1Q,那么来大家请看这是不是一个循环反复的要准备入队对吧?至于说怎么入的一些细节,我们后面拿动画片给大家呢,这个来进行相关的讲解,好,这是我们的第二个分支组,对,那么第三个呢,就是acquire的。Q的,那么就是尝试着再抢抢,我不排着队吗?只要有人释放了,我是不是要尝试再抢抢?那么所以说如果搁到这儿了以后,那么同学们。
07:05
跑到这儿,那么第二个方法入队,我们就排着,然后呢再抢抢点开,那么大家请看,那么就是这一段代码完了以后要用这个A块,那么就分成两段。第一段,那么就是try OK,请看这有个fail是什么,True,如果true的话。什么概念?如果这块是if的失败是处的话,是取消这个队列,否则的话,那么同学们请看,如果它都是正常的入队和出队,这个file的失败是否失败者会改成false,如果是force的话,他就不走,那么说穿了,这个就代表正常的入队,排队,办理业务。第二个。Finally那么理想,丰满,现实,骨寡骨感,怎么可能永远是顺利,如果是某个节点他不想排了,或者被意外的中断了,那么要取消这个占用,取消这个排队,OK,好,所以说这个就是我们三大方法的流程,那么同学们tryta quite q,然后呢,分别是入队或者是取消等等,那么这个就是我们。
08:11
三大业务流程走向的相关介绍,也即后续就是这三个方法的折腾。那么好,为了保证大家的理解和深刻,阳哥写了一个案例,并且用动画的形式带着大家彻底拿下来。回到我们的aqs啊,我们模拟这么一个三个线程,甚至啊,当然这个可以是四个五个六个都可以啊,我们这儿呢,就模拟ABC3个顾客去银行办理业务,A先到,此时窗口空无一人,他优先获得办理窗口业务的机会去办理业务,那么好,同学们,这个就是一把锁,相当于这个就是非公平锁,对吧,原程的work,我们这儿什么都不穿。以force或者是不传为例,非公平,那么这就是A线程A号顾客,但是呢,A顾客呢,去银行办理业务呢,耗时严重。
09:04
估计会长期占有这个窗口,那么来同学们,洛啊洛,进来了多长时间,20分钟,那么说白了,这个办理这个银行,假设现在这个资源,这个窗口只有有且仅有一个,那么A窗口就要去占用20分钟。明白,那么好了,A在办理业务的时候,BCDFG等等等等,后面的顾客都会陆续进入到银行一看,此时窗口有一个叫A的顾客占用着,那么按照我们的aqa啊。B进来了,是第二个顾客。B1看到受力窗口被A占用了,那么他只能去后客区,进入到我们的AQS队列,等待着A办理完成,尝试去抢占受力窗口,那么B进来了,一看A在那占用着,乖乖的进入到我们的AQS队列,这是我们的B,就是第二个顾客,第二个请求线程,那么C是第三个顾客,C呢,一看,哟,受力窗口A也在用着呢,只能去后客区进入到AKS队列,等待着A办理完成,尝试去抢占受理窗口,前面顾客是B,那么如果我。
10:10
进入到队列了,是不是要遵守fio的原则?那么这个就是C第三个顾客,OK,那么当然后面的deg,以此类推,好程序很简单,当然啊,这个程序我不用去执行,只是这么一写,提前给大家写好,没有听说过这20分钟的某个业务,这太恐怖了,对吧?只是这么一个意思啊,那么来吧,回到我们这张图,大概说一下。不管是三个四个五个都行啊,我们这儿图简单,那么就是。三个顾客来银行办理业务,模拟三个现成请求现成,现成就是顾客。顾客就是。线成OKABC,那们都晓得AQS啊,是什么加CLH这么一个虚拟的双向队列,这个也就是我们之前在这个图上抓过的这个动作没问题吧,你就把它当做一个信号灯,绿色是零,代表空闲,如果待会有人占用了,我就把它刷成红色,那么这个值就会变成一听懂那么其他的状态来判断。
11:10
一看这个状态是一,就说明什么,在这儿有受理业务窗口,有人在用着,比如说张三这个顾客,那么绿色的时候这个是个,那红色的时候标识位时间说明什么,有人占用,OK,好那么同学们这个呢,就是我们想提前给大家做好这个相关的约定,好那么这个呢,就是我们的。窗口每次只能服务一个顾客,初始时没有人,那么下面这个虚线就是模拟银行的后客区,等候区,每个线程就是一个顾客,那么前面强调过AQS啊,内部是不是有个noe节点,那个note节点相当于银行后口区的一张张椅子啊,每个请求线程thread就坐在这个note节点里面封装进去,那么相当于说现在。我呢,假设有一个顾客啊,呃,比如说现在这个顾客A就在这儿,把这个受理业务的窗口已经占用了,B进来哟,一看这个有人占用,那么我只好去排队,那么假设现在B进来了,C一看有人占用,我也只好去排队,那么B一看有人占用,我也只好去排队,以此类推,那么后续就会给大家说一下这些细节,从状态位的变化到。
12:23
封装好顾客请求,现成的漏斗节点是如何出队、入队、通知,唤醒、排队取消的各种A的细节,那么这个就是我们源码分析的意义,只有通过它你才能够把这张彻底完全的十透,这个时候你就会明白前面我们做这些铺垫,这些老师为什么要带着大家过一遍这些状态外,那么你呢,就不会卡壳了。好,那么大家加油,跟着杨哥拿下这段源码分析。
我来说两句