00:00
接下来B跟C彻彻底底入队坐稳了,只能是在这好好的候着了,那么好,回到我们的程序,再次强调,B跟C没结束呢,停在这个方法里面了,OK吧,那么接下来我们来看一下。那么从头到尾我们这几个方法,TRY,艾德维塔C块re q的几乎是全部讲完了,那么李理我们的流产,那么现在块这个的话呢,我们刚才可以看到了。这个头节点红框框是不是我们说过了哨边节点和伴随着B或者是C在强强。抢的成功了,直接上外去窗口办理业务,抢不成功了。是不是被阻塞只能在队列里面,洛克斯珀帕在这等着,直到被唤醒为止,OK,那么好,我们呢,假如再抢抢失败,就会进入到我们的这几个方法,那么这个方法我们刚才也强调了一个是这个。
01:03
一个是这个OK,这两个是重点啊,我们的主要流程,那么如果是这个的话呢,我们呢,来看一下。这个是获得前驱节点的状态。那么现在是不是我们的哨兵节点的状态?刚才说过了,如果是signal,即等待被占用的线程要释放,直接返回错,准备继续调用park and check interrupt方法,否则的话。我们会执行下面这个,OK,那么这些呢,前面都说过,好,那么如果前区节点啊,它是西格,就是负一,那么也就说这个方法会返回错,程序会持续继续向下执行这个方法用于将当前线程挂起,那么这个呢,我们呢,详细的讲解过,挂起是洛帕,说白了我们是不是走过两次啊,第一次是返回force,第二次是返回错,把它挂起好那么。最后一个方法就是这个,那么这这个的时候什么线程挂起,程序不会继续往下走,OK,那么我们到这儿了以后就会清楚B跟C在这被阻塞被挂起,正在排队等待中,BC没完呢,好,那么接下来呢,同学们周旋,那么你这个A在这站这么半天了,是不是应该走了,是不是应该安洛克了,听懂了吧,那么。
02:23
回到我们的程序终于到这儿,A呢,20分钟办的差不多了,是不是准备安洛克了?那么你晓得的,只要ae解锁aqs等候区里面的B跟C是不是开始可以蠢蠢欲动去抢啊,那么好,接下来我们呢,就要走我们的。按洛克方法好,那么它的流程呢,一条龙。底层按lo,你看又调用的是S的release方法,那么我加了一次锁,是不是要解次锁?OK,两两配对。那么。我们走起来,这个是我们的A线程,干嘛按落我点,大家请看按落方法,底层调的也是C口的release,我点。
03:09
这个值是一,然后它调的是哪个try release方法,那么进去请看又是一个什么模板方法,把规范定义的足够高。逼着此类必须去实现,你不实现我就跟你闹,我就报异常错,OK,那么所以说搁到这儿,我们找到我们本次走的是这个re look,好,那么接下来那么请看。以前我们叫什么,这个方法眼熟吧,这是lock加锁的时候,现在我们要调用try release干嘛?用完了解锁的时候就是A办理完业务是不是准备离开了,他怎么干呢?现在A调用unlo克,A现在get status几,现在status是几,是不是一,那么你传建的release是几,是不是也是一,一减一,这个C等于几等于零,那么好,现在free瑞等于负,那么现在C等于零,进不进来一减一等于零嘛,对不对,要把这个这个状态标志外从一变成零,说明我不占用了,我A要办完了我安洛克解锁状态,那么现在这个福瑞将会从force。
04:21
变成了什么?变成了,然后请看set exclusive owner th,设置当前窗口的占用线程,为什么为,就是到这步,意思就是A。已经。办完了,准备。屁股挪开,离开窗口,离开座位,准备走了,A要安落克示范锁了,那么一示范,所以后这个受力窗口这个业务是不是又开放了,B跟C准备可以开始来获得了,那么走起,然后设置C等于C,这个C现在是几?是不是零?因为A走了,那么现在这个状态标志位是不是又恢复成自由状态,没有人占用了铜。
05:03
红色的一变成了绿色的零。同学们能跟上,说明现在没有人了,状态位是零,好,那么现在走起return福瑞,现在福瑞是什么?是不是就是我们的初二好的。那么过来。回到上一步,If是初二,进不进来当然进来了,那么请看,那么现在no h2H等于头指针,现在告诉我头指针指向谁?是不是哨边节点?他的意思是什么呢?你A走了以后,根据排队的话,先fio嘛,先进先出啊,下一个上位的是不是应该是B,那么是不是就牵扯到这个哨兵节点和B节点如何?出对的问题,如何从这个等候区出来,那么这个就要出去,这个是不是要去受理窗口去办理业务了,那么来看一下现在H啊,就是这个小H,小H是谁?小H啊是不是就我们头指针就是我们的这个哨兵节点,然后它干什么?H不等于捺。
06:03
H的也不等于零,那么请看H这个指针指向了一个节点,就是我们的哨节点,确实不等于呢?哨兵节点它的等待状态是多少?负一,负一是不是不等于零?正确进来,注意,请看这叫什么安帕,是S,要把这个H唤醒安帕知道什么叫洛克的帕安帕了吧?所以说安帕success,那么我们一点进来,注意现在这个H是谁?是哨兵节点,我点。它干什么?如果说这个哨宾节点的塔塔叫WS,现在值是多少?是不是负一啊?请问负一是否小于零?当然小于了,然后干什么?比较并设置维塔斯的值,又把它设成多少?又把它设成零,好,那么按照我们的原码分析,又被设回了零,好的。
07:00
那么接下来我们走起,那么这个no no。就是我们的哨兵节点,说哨兵节点的下一个节点是这个S啊,S是谁?是不是现在就是我们的这个B节点,没问题吧,S就是B节点,他问你节点等于那吗?B节点不等于捺有指针指着对吧?B节点有有有有食物,有顾客,B节点的塔大于零吗?不大于B节点的等于零,所以说这个暂时不进来,那么接下来B节点并不等于那。清楚啊,然后support注意。And park。B节点这个thread要被解锁,明白要被唤醒,要被通知啊。恭喜你,B节点,A节点已经走了,你可以上位,可以去业务节点去办理了,那么一旦战时洛克support安帕,我们前面抓图的这个地方,我前面是不是说过B是被阻塞中,正在排队等待。
08:04
在这转着呢,那么现在是不是有这么一行代码要让这个B出对去受理窗口办理业务的呀,明白了吧,所以说你看底层是非常复杂,所以说同学们请坚持下来。这些东西不见得能够让你马上能做点什么东西,但是程序员的内功就是能够这么点点滴滴啃下来,你把它死磕出来的,以后你写队列、写程序的内部中间键的那些高级程序员,一定要具备这种读源码的能力。好,同学们,我们这安帕说明什么?B是不是就直接?干嘛,完完全全要被唤醒了,那么所以说我们现在安帕克里后,我们要回到我们这个方法,这一波能跟上好,那么。走到这儿,我们呢,回到我们的注意啊,这是洛克的安帕,那么回到我们的这个方法,我们刚才是不是说过,也在这儿反复的强调过,B跟C在这还转着呢,没结束呢,听懂了吧,那么现在B就被什么。
09:11
安了,那么B是不是就马上往下走,那么TH的interrupt,那么返回,那么现在。告诉我,我们的程序有没有被什么谁interrupt中断过?没有,那么没有被中断过,它的中断标注的默认值是什么?是force那么好。现在呢,我们呢,直接啊。呃,搁到这儿了以后,哎哟,这个方法的话呢,我们直接再找一下啊。那么行,完成这个了以后,我们相当于说在这我们这儿干嘛,返回的是什么?就是前面这个方法啊,没有被中断过,那么我们是不是又回来了,那么现在跳出这个if,别忘了这是个自学没结束呢,又过来,那么。来note节点,这个note节点现在是谁?BB节点的前驱节点是这个PP是谁?头节点就是我们哨兵节点,说哨兵节点等不等于这个头节点,请看哨兵头节点是不是指向这个哨兵节点,回答是错,然后B。
10:17
TRY块再抢抢,那么我点。然后。继续和我们刚才一样,再过来,再过来,那么好了,因为现在情况已经变了,听懂了吧,A已经走了,这个灯可是绿色值是零,那么现在过来看现在是谁,现在这个节点。当前线程就是B,好。B get,这个CC等不等于零,132行,请告诉我,塔这个值现在等不等于零,当然等于零了。那么过。我们呢,Compare and set,就希望你是零。果然是零了,现在设置成几,设置成一,然后这个又被占用了,那么现在这个东东。
11:04
又被谁占用了,又被B这个节点给占用了,B线程占用,那么现在它是一设置占用的这个线程是谁?Current是谁?是不是就是我们的B呀,这一波同学们。能跟上,那么这个是不是就是我们的thread b,那么现在B是不是又在这个窗口了,它要从队列里面上位去办理业务了,那么这返回一个什么轨返回一个出好,那么。返回处了以后,那么同学们请看这儿,那么我们都清楚在这儿返回处走起,那么现在是不是头节点?是我们的哨兵节点这一块,踹了以后B上位,他就去业务窗口。办理业务了,那么接下来我们是不是要处理aqs里面的这个头节点,哨兵节点和这个B节点如何出对的问题,因为这儿也有B,这儿有B,不可能一定要把这个引用用GC回收掉,对吧?那么所以说因为B嘛,不可能同时出现在两个地方,那么根据我们的程序,B应该去上位去受理窗口办理业务了,那么。
12:14
现在头节点是照频节点是错,B节点抢占窗口成高,那么进来终于走到这个if,那么set had等于这个not那么。过来,现在这个node就是我们的什么节点b that had,那么请看node是B,那么让B节点等于had听懂了吧?那么换句话说是什么?现在主要干的事儿就是。哨兵节点出对明白吗?所以说这个had的节点,根据我们的源代码B节点的位置啊。用he的节点要指向B指针的位置,那么以前是指向哨兵节点,现在指向这个B节点,这一波同学们能跟上。
13:00
甭着急,你可能会说,哎,不是B节点是这样吗?怎么这儿我们说的是引用的位置内存值,好,现在头节点以前是指向哨边节点,现在就指向了这个这个位置听到。走起,然后B节点的thread等于,那哎,为什么,因为B节点其实是是不是已经上位,已经走了,所以说是现在。这个东西。等于捺,这一波能跟上好的,然后B节点的前指针等于捺好B节点的前面这个指针等于捺。这么说能跟上,那么所以说现在有一种感觉,慢慢的这个没有任何指针指向它,原来的这个哨屏节点是不是慢慢的就要被GC回收掉,所以说他就要出对了,那么原来的B节点由于他已经出对了,去受理业务窗口,去办理业务啊,那么原来的这个B节点是不是要慢慢变成新的哨兵节点,持续在占位呀,所以说这个是不是又变成了。
14:04
新的。哨兵节点了,这一波能跟上好,那么现在上。跑到这儿,B减的前一个等于那那B减的前一个等于那刚刚删掉了,那么走起我们呢,完成了s head这个方法,那么接下来。原来P节点的next节点等于,那你看是不是help普及C,那么所以说现在呢,就是说原有的这个哨边节点的是吗?Next等于nine,那么现在没有这个指针啊,那么你告诉我现在是不是在这个逗后克区里面,原来的哨边节点没有任何一个引用或者是指针指向它,它慢慢的是就是应该被GC回收掉啊,那么原来的P节点上未去窗口办理业务啊,它是不是就变成了新的哨兵节点,继续担任我们对应的工作,那么同学们。他们现在是不是又变成了新的队列的状况,那么它是怎么弄的,就这么一步一步来的。好,那么最后请大家看那么费。
15:08
以前是true,现在这个fair干嘛?First是不是正常的办理业务,那么如果finally正是就没有走取消排队这个事儿,那么interrupt因为没有任何打断,整个方法就结束。OK,所以说同学们那么讲完B以后,C怎么出对的也就不用我说了吧,一样的就是这个效果,那么搁到这儿了以后,我们才彻底完成了我们全面的全部内容。杀回马枪能理解了吧?那么最终我们要执行这么一个。保障。A节点走了以后,B节点上位,并且上位的上位,清空清理门户,把队列里面完完全全的洗干净,这一波能跟上。
我来说两句