00:00
好,同学们,前面这些流程和步骤我们已经详细介绍完成,一步一步的通过动画片的模式啊,给大家明白了这些指针是怎么指向的,头指针为指针,前指针后指针,四大指针的配合完成了A队列,有队列管理了里面的。Node节点前后形成了双向链表,那接下来我们呢,继续往前推进,来看看我们的第三个方法,Acquire q,那么这个ADD讲完了,下面就要讲第三个。回到我们的源代码。来同学们这个讲过了,这个艾德维塔也说清楚了,BC现在慢慢的入队了,对吧,形成了这个等待队列,好,那么下面第三个方法,Acquire。那么。走起。B。还是第一个。过来,那么大家请看啊,他那干一件什么事呢?
01:04
Fair是错,那么如果fail是true是什么意思啊?Finally,如果这是错,是不是就要取消我们的排队,因为实际当中也有可能啊B等着等着不相等了,那么走人,那么我们本次啊,这些极端的情况和其他的情况先不说,我们只走主干流程,那么现在把主要流程拉通,如果这个fair是错。初始值啊interrupted有没有被打断,比方说啊打断,比方我们模拟生活中各位顾客,不好意思啊,我们银行系统出故障了,大家抱歉,去别的银行去办理吧,那么这个队我是不是白排?那么现在是不是我们业务被打断好类似的啊,那么现在这个初始值是负好那么现在注意看又是什么,是不是又是自学。走起来,那么现在呢,这个node就是我们的B节点啊,我们入队的时候是不是BC,那么现在挨个,因为队列嘛,就是先进先占先得那么B。
02:02
所以这么一个方法,那么干嘛呢?得到一个指针P,那么好,我们来看看,那么我们先来看node的这个P,这个方法是干什么的,那么它意思就是这个P等于。那么现在B节点的pro是谁?是不是就是我们的这个哨兵节点啊,这一波能跟上,那么现在这个P就是指哨兵节点返回,这个就是我们的第一队列里面的第一个节点,灰色的这个哨兵节点,站位节点好走起。那么现在这个P就是哨平节点来进行判断,他说这个P灰色的哨平节点等不等于头节点,当然等于了,这个是处,为什么?因为头指针是不是指向它,这个是个处,OK,然后并且你看又调用try a块什么意思啊,那么。我现在这个B在后口区,是不是眼睛就看着这个窗口也等着叫号器叫。
03:00
看看我可不可以办理业务了,那么是不是准备再抢抢好,那么如你所愿。D再抢一次试试,你看是不是还是跟刚才那些代码多看几次你就熟悉了,那么过来你看是不是又是这个代码了,见过了吧,我点进去,那么现在呢。当前线程是谁?是不是就是我们的B能跟上,那么得到这个值,不好意思啊,C现在这个值是多少?C现在这个值是塔的,这个值是几是一,那么这一段不进来l if。那么挨个挨个条件我们再来判断,我们也知道现在呢,根本进不了,当前线程是B准备去抢,但是现在持有的是谁A用户A线程是不是在这在坐着转站着,这个窗口爽着呢,他在办理这业务进不来,所以说这返回什么return force,那么回到这了以后就说明什么,这个条件头节点是我们的哨兵节点负有的,但是B再强强怎么着失败了,听到那么所以说这个时候这段不进了。
04:06
往下走,请看到这一段的时候,你就会知道杨哥的苦心,为什么前面要详细重点的跟你说前置知识,Look support OK,那么现在这个B。入队了以后还不老实啊,干嘛?他是不是还再抢,抢又抢了一次啊,又抢了一次,发现什么还是失败对吧?那么过来这儿了,那么请看should park after fire acquire,你看看这个名字的命名都很爽。它是在。抢占失败之后是不是应该被帕,我们前面讲过洛克破帕是不是就相当于阻塞,类似于wait的那种方法,那么现在传两个参数进去,这个P就是我们的头节点,灰色的哨兵节点,这个no就是我们的第二个节点B节点,好,那么走过来。现在他来问你是这样的?
05:01
哥们儿。这个的前置节点就是我们的头节点,头节点哨兵节点的等于多少?那么一切默认值啊,这个等于几?现在是不是零啊?我们前面是不是说过有两个重要的参数啊。Aqs是少,每一个node里面它有一个等待的这个状态,那么现在是几是零?好,那么现在这个值是多少?是零过来走判断,那么现在这个WS的值是零,零等于西格嘛,西格的值是多少?是负一啊,不进来那么再来看WS的值现在是零,零大于零吗?也没有大于不进来L只能干什么?注意比较并交换CS,设置塔塔S。改变它的值咯,那么让P就是节点的值啊,让这个WS啊,WS什么意思啊,就是这个这个值啊,从零变成几。啊,兄弟们是不是变成负一啊,所以说到这儿了,这步以后返回first,但是这一行代码就将我们哨兵节点的值啊。
06:07
变成了负一,这一波能跟上好的,那么这儿就是return force,好,那接下来同学们。走起,现在这个是不是就return了。结束,别忘了人家这个诊断是个自学,那么第二次再过来,那么现在又让你来弄,那么这个no的节点还是我们的是吗?B节点,B节点的前一个节点是谁?是不是我们的哨兵节点头节点再抢抢抢成功了,那么B上位讲不成功了,那么继续往下走,那么第二次又走到了这个方法,那么进来这个时候。头节点,头节点的哨边节点的位置塔,这个值是多少?现在这个值是几了?是不是被改过了?现在是负一了,那么他问你负一。
07:00
等不等于我们的负一当然等于了,进来返回什么负?所以说第二次就是返回处了。那么兄弟们相当于说这个。B节点已经抢了很多次了,由于我们这个A节点是吧,它占用的这个窗口的时间比较长,一直是它B节点,没办法,只能在这好好的等着,那么好了,各种再强抢都失败了,所以说现在这个第二次进来,它是返回了什么错,那么返回出了以后是不是往前走,往前走请看park,并且检查是否被中断,那么我点。此时大家请看这是不是有我们所熟悉的look support.park这个this是谁?就是我们的节点B,那么所以说到这儿才说明B在这儿被挂起,被阻塞,它到这儿你就可以把它理解为才是真真正正的入队了,真真正正的这个顾客坐在了后客区的椅子上,为啥park了这一波能跟上?那么所以说。
08:10
在这我们为了方便后面好讲啊,我们在这呢,要把这个呢抓图抓出来,要给同学们说清楚,注意啊。那么现在重点的话到这一行了。明白,那么你要注意啊,程序并没有结束呢,这一波兄弟们能不能跟上,那么这个时候是谁呀?是不是我们的B,就是第二个顾客在这儿被阻塞啊,能跟上。那么相当于说就是什么。正在。排队等待中。这一波,同学们OK吧。正在排队等待中,那么相当于说我们这个B现在就在这儿转着,就被卡死了,明白了吗?那么B就在这转着呢,这一波能跟上没有结束呢啊,这个程序没有停了,好,那么由于B就在这儿等着了,那么是不是是是不是说明要有人来安帕唤醒这个B才能够放行啊,那么这个时候什么概念?也就是我们这儿除非是A。
09:20
调用安洛克走了,那么等在队列中等待的第一个B才能上位,清楚了吗?那么我们后面会说这儿先提前剧透一下,那么好,你就给我记着,到这儿了以后park and check interrupt,那么现在就是park b就在这儿候着了,到这一步B才真真正正的入队,坐稳了,老老实实的给我坐稳了,等着等着A办完了以后你再上位。好,那么诸如此类,那么同学们现在完成了以后,我们的B节点到这儿也就这么回事了,那么一样,后续如法炮制啊,就不再走一遍了,我们的C节点是不是也最终会执行到这个lock.park那么你懂得这这个C是不是也会在这这么绕着,那说明在这个AQS队列里面,BC2个顾客就这么安安心心的等着了,清楚了吧,所以说这个就是我们BC真真正正的落听了,坐稳了。
10:23
真终于入队了,那么到这儿几乎B跟C就结束了,好,但是再次强调啊。现在我的程序B跟C是在这个方法里面,他们两个在里面转着呢,这个方法没结束呢,听懂了吧,待会儿会恢复,不OK那么好,为了怕大家这个待会儿呢,懵逼啊,我再讲详细一点。我把这儿。弄过来,那么也就是说现在啊,我们的这个程序是这样的。B跟c park and check什么概念,我们的B跟C啊,是在这还没有完呢,听到。
11:04
这个程序就卡在这儿,这转着转着圈呢,它没有结束呢,明白了吧,待会儿是不是一定会有IPA程序把它又。把这个阻塞消失,然后让他B跟C唤醒啊,OK,唤醒干嘛,A办完了是不是要按诺克解锁,那么B跟C被唤醒以后,是不是他们俩要去抢下一个去受理窗口办理业务的顾客,OK,所以说在这儿啊,我们这儿呢,就是听好这段还没有结束呢,好,那么这个呢,就是我们的。到BC这个方法,相关入队和作文的这个介绍。
我来说两句