00:00
好,同学们,我们继续,那么通过前面的讲解主要流程继续走B在这儿想尝试着强盗锁,失败。这个是force,这个force整体取法就是true true的话继续往前调用这个方法,那么这个方法里面就是一个and wait这个方法,那么下面我们可以看得出传了一个node是exclusive这么一个属性的好进来,那么现在同学们请看。当前线程这个是谁?是我们的第二个顾客B线程。它的模式是什么?就是我们的这个exclusive过来的参数。那么现在。606行的这个node就是我们的第二个顾客县城B,好,由于他没有抢到锁,准备入队去银行的什么候客区能跟上等候区。坐着,然后这边窗口腾出来了,他才能进去补位上位好的,那么下面。
01:00
No的这么一个,等于tell什么节点?OK,那么现在你告诉我,根本就没有任何一个人排在这儿呢,这个尾节点现在是什么?是不是相当于说现在这面有一个指指针?这一波能理解这个尾节点AK同步器,那么它这个属性现在是什么,是不是这就写这个none啊。能跟上,那么那不等于那first,所以说这段不进来,那么B线程进入的是en q准备进入队列,这个方法调的是616,那么好,现在这个node记着啊,高亮显示的606行,这个node就是B,那么B就准备en q入队了,那么进入到这个方法,那么同学们。请看一下。现在这个就是我们的node b,好,Node里面封装线程来,这是什么?是不是相当于YL处的自旋,明白吗?那么走起现在呢?有一个T,它的指向和指针被T为指针赋值啊,那么这个T就是为指针,OK,那么现在。
02:11
判断这个T就是为指针等于难吗?大家请看现在这个为指针,当然什么都没指向,没有指向任何一个元素,当然是等于烂了,OK,那么过来干嘛?开始must初始化,那么走起,注意这个是我们传进来的参数B,但是这有一个方法叫。比较并设置头,请看它拗了个什么?拗了一个空结点,所以说在这个队列里面的第一个节点并不是我们的闭节点,而是系统内部拗了一个空节点作为占位符,这一定要小心。那么走起我们来看它的意思是什么,希望这个对象的这个位置是个,那然后就更新成我们的六出来的这个node底层也是个按S方法调用的CS啊,请看CS的头。
03:06
节点的F的属性设置,那么主要用于入队,那么走起。它的意思是这样的,如果现在为指针没有说明还没有任何一个元素进到这个队列,那么我们就新建一个node,把它作为什么头节点,再次强调是底层自己新建的,不是我们传进来的这个B,那么所以说在这我们这个B节点就准备进来了,听懂了吧,但是非常抱歉进来之前,那么我们在这还不是这么一个简单的。B节点,那么我们在这我们可以看到我们的源码是不是用了这么一个noe。大家看这是不是拗了一个node,没问题吧?点开源码进去看,这是它的一个构造方法,再点开我们的这个源码,同学们都清楚啊,这个六的是不是就有头指针为指针要被指向,那么这个node进去了以后,那么弟兄们我们清楚啊,这个node它现在有两个重要的参数啊,一个叫wait in型初始值是多少,是零,那么现在这个线程是什么,是不是就是个nu啊,所以呢。
04:25
我们在这儿拿过来,你这相当于说。你当前这个顾客根本就不是B,是我们的,那你这个wait status是几?初始值是零,那么实不相瞒,现在B还没有进来呢。目前这个一般就称为。傀儡节点,或者也叫哨兵节点。它的作用就是一个干嘛只是用来。占位。
05:01
对,波O不O,所以说现在我们就有这么一个节点,那么根据我们的代码上面相关的要求,请大家看比较并设置什么头节点,我们六出来的这个节点就是它就是现在这个,好,我为了好说,那么我就把它涂成一个灰色的,那么它的意思就是说哥们儿现在呢?头节点就请你指向它。这一波同学们能不能跟上好的?完了以后再请看。把头节点再付给尾节点。明白,那么意思就是说头指头节点,头指针指向了这个,把尾节点也指向它,那么此时就变成了这样,那么现在终于我们在这个里面,虚框框里面,等候区里面来了第一个节点叫哨兵节点,它不是真实的节点,它只为占位,OK,好,那么现在。
06:02
同学们,完成到这儿了以后,这个if是不是就结束,注意完成了什么,初始化好,If走了else这个分支啊,就不走,第二次再过来,那么现在。注意传过来这个参数,这个node才是B,现在T就等于尾节点,那么请大家看尾节点指着谁,指着我们的哨兵节点,OK,那么现在T等于烂不可以已经指着我们的这个哨兵节点了,他不再是那if不再走了,我们走else,这个时候他是这么干的。这个时候才是我们的第二个顾客,B节点真正真正的入对好,他的意思是B节点的前一个指针指向TT是谁,T就是我们的为指针所指向的这个节点,那么它的意思就是说B节点的前一个指针。那么B节点的前一个指针等于这个尾节点,那么是不是就是我们哨兵节点,那么到这儿。
07:02
我们模拟出来的效果。如下,那么这个呢,我把它用绿色标起来好说,那么它的意思就是说请看啊。B节点的前指针等于这个T等于这个尾指针,那么这个尾指针现在是不是指着哨兵节点。那么所以说在这。过了这个就是前指针,那么导致我这个B就挂在这个哨兵节点的后面,然后呢,比较并交换。设置什么尾节点,我希望当前的尾节点是这个T,然后把它又指向这个谁?No的是我们的B,那么OK,意思就是说如果B进来了,那么现在他。就不再是最后一个了,那么现在我们的尾指针是不是要变化了,就要指向我们的第二个节点,就是我们的这个节点,那么我们这个节点现在可就是正儿八经的我们的B他的为的贝塔等候的状态默认值也是零,这个就是我们的顾客币这一波同学们OK吧,那么再来。
08:12
接下来呢,他说T节点的下一个节点就等于no,我们说过了T节点之前干嘛,是不是就是我们这个T是这个尾节点指向的指针,那么T的下一个就是这个no,那么弟兄们都明白上一步的时候,我们这个T节点是不是指向它,那么就是说明哨兵节点的下一个节点,那么这个。Next就指向我们的这个B节点,然后返回,T能跟上,因为在这我们已经说过了。B节点的前一个就是TT是谁,T就是这个哨兵节点灰色这个,那么到这儿以后就是这个灰色这个哨兵节点,下一个就是B,那么这个时候是不是就把它连连匹配。
09:00
那么头节点尾节点,前指针后指针,这个时候同学们能不能理解杨哥?抱歉,前面所写的头尾前后这四大指针四大节点是什么意思了吧?能不能有点体会是什么懂不懂了吧?每一个节点里面封装的是一个no的,就是我们的一个个顾客请求线程。好,那么现在体会一下这个B节点是怎么入队,怎么进等候区的,我们的源码分析是怎么出来的,这个就是我们的状态标识变化的持续流程图,你孤立的去看这个源代码,你看的会懵逼的,很枯燥,而且看不懂,你只有这样像动画片一样的一步一步的给你说清楚,你才知道,哦,原来B是怎么进来的。实际工作中的考试题目,我听过那个面试录音。面试官原话,你说你看过AQS的源码,第一个他去强盗锁了,第二个以后是不是应该入队去等号,你说yes,那么他问你,那么等号队列里面的第一个节点是不是就是我们的B节点,你说yes,那么这个时候就回答错误,我们可以看得出第一个节点不是我们的B节点是谁,是一个傀儡节点,也就是一个哨兵节点,由他到后续我们会来讲啊,负责通知唤醒后面队内的,然后呢,排队出出列去抢占窗口,OK,那么好,同学们,搁到这儿我们就完成了我们的B节点的是吗?
10:31
入队。
我来说两句