00:00
各位同学大家好,我们继续。那么现在我们已经完成了第一个方法try acquire相关的讲解,那么它呢?进入不了这个窗口,只能去排队,那接下来看一下我们的流程,要用这个对吧,这些呢都给大家讲了,那么接下来第二个流程,艾德维,那么就要参加排队入队了,好了,那么早起。搁到这儿,前面我们的第二个顾客线程B。整个是得到的,这个值得到是false,整体而言,False取法是处过来这。那么大家请看node.exclusive,它是属于什么独占类的note节点好。进到这儿,那么来了,接下来呢,就要看一下创建一个入对的note节点,对于当前线程按照所给定的模式好了,那么下面我们前面讲过这个模式,现在能理解为什么前面要带着大家过一遍了吗?
01:01
共享的还是排他的,所以你这个节点要说清楚,那么这个呢,就是代表是共享模式等待锁啊,这个呢,就代表是独占或者叫排他的模式等待锁好。它建设的节点是这样的,那么现在这个节点啊,那么上一步同学们请看。Ta no exclusive,他丢的是这个啊,这个节点那么过来了。进来了以后好拗了一个no,我们前面说过每一个no节点,其实质而言是不是封装进去一个当前线程啊,那么搁到这儿了以后,就是我们这张图,那么相当于说现在B要进来了,他呢要做一个漏斗节点被封装进去,进入到队列,好,那么当前线程就是二号顾客线程B它这个moded,我们前面讲了什么模式啊。Exclusive排他模式,好,这个就是我们的节点BOK,好,那么现在大家请看。
02:01
根据源码分析,那么这node p就是前置的,这个引用就等于我们的T。也就是我们这儿所画的这个头尾指针,这个太,那么现在指着什么?根本没有任何一个节点进来呢,对吧,所以说现在它就是个,那就是个空好了,那么现在。尾就是这个pde,伪指针就是这个P的pde不等于那错,现在pde就是纬纬指针就是等于那所以不进来,那么所以我们得到第一个结论,怎么着,它现在要en n q干嘛进入到这个队列,那么现在这个node就是我们当前的节点B模式啊,就是。这个排他模式好的进来,那么大家请看。那么你看插入节点,进入到队列,看注释就会发现对吧?那么如果有必要的话呢,需要进行什么初始化,那么这个时候请大家看这个节点就是我们的节点B好进来回来这负这是一个循环,那么来了第一个。
03:10
第五百八十五行这个T。跟这个T尾节点是一样的,相当于说把尾节点的位置付给它,那么你可以把它理解为这有个引用也是T,不过呢,这个T其实也就是这个T啊,一回事,好,那么这个T现在等不等于呢?当然等于了,没有任何一个人进来,对吧?所以说请看后面的注释。必须初始化,注意重点,这儿我们这个参数呈现的是节点B,但是。Compare and set头节点,请大家看,这是new mode,相当于我们要入队的这个节点B。并不是。头节点,而是在这儿系统底层代码给你六了一个新的节点,请看比较并设置为头节点,也就是说他现在六的这么一个空节点。
04:04
作为一个头节点过来这儿请看。当前这个偏移量的位置啊,设希望它是什么,那然后呢,就update,那么相当于说更新为头节点,意思就是说这有一个六漏斗节点,注意。第二次强调,不是我们船上这个参数递节点,所以各位同学在这呢,它呢就有一个头节点。好了啊,这个头节点就搁到这儿,设置一个什么概念呢?比较并交换,那么现在它是第一个肯定是,那么希望值是OK的,过来你了这么一个节点,那么这个节点请大家看设置为头。欧啦,那么过来这儿。那么相当于说就是我们的氦的指针就指向它,它就是我们现在谬出来的这个节点啊,我们在这呢,说清楚,那么这个时候听好不是我们的B节点在系统里面这个哥们,它就叫做。
05:10
虚拟节点,或者也叫哨兵,哨兵节点。哨兵节点,或者也叫什么虚拟节点,OK,它的作用就是一件事。占位。OK,好了,那么割下来。此时它这个里面没有什么。顾客,OK,那么每一个节点都有一个叫什么?Wait status,前面说过了,默认值int类型就是零,就这么简单,OK,那么同学们,在这块请大家一定要注意这个节点它所设想的功能,那么好了。它没有放任何东西,大家请看,是六出来的,空空如也,那么按照我们的构造方法,就是一个空的,好吧,好了,那么搁到这儿设置为头节点,然后再把头节点设置给尾节点,OK,那么得到我们的结论,所以说终于现在来货了,那么这我们呢,就把它称为虚节点。
06:14
OK吧,那么这个东东我们认认真真的给他走一遍,现在就得到头尾节点入队成功,那么由于它是虚节点,我们呢,就暂时把它设置为我们的灰色。OK吧,那么在在这儿得到了,他成功的进入了队列。好。那么。完火以后if结束,别忘了人家是个循环,没完呢,再过来现在。告诉你T就是这个T尾节点,那么现在T就是值跟尾节点一样,它等于那吗?当然不等于了,我们的尾节点是不是应该是指着我们刚刚溜出来的这个虚拟节点了?OK,好了,那么完活以后,所以说if初始化完成第一次搞定,接下来走到了else,那么来这三个方法比较关键,那么现在这个T。
07:11
就等于请看。也就是说这个no就是我们的第二个节点B,那么no这个节点呢,就是它的前指针就指向这个TT是谁,T就是尾节点,也即OK,那我明白了,那么这个节点呢,就是我们的节点B,它才是我们真正真正要入对的。好,那。他所能搞定的事呢,是这样的,这个时候他就不是。又出来的了,而这个是我们真真正正的节点B。OK,就是我们的第二个顾客,那么这个线程也就是刚才我们所说的节点B,好,那么相当于说为指针就付给了node的pro,相当于说这个B节点的前一个就要指向为指针指的,那么为指针指的是不是就是现在这个虚拟节点占位节点啊,OK,那么所以说在这儿同学们拉一条线。
08:12
我呢,这个就是。OK,好,那么接下来比较并交换set ta,那么相当于说把你这个这个呢,都晓得这是期望值,不会错的啊,这个是update更新这个值又是个CS操作,那么相当于说把你的这个尾节点呢。就从原来的T变成这个no,因为这个B入队了以后,它肯定是队列按照排队嘛,对吧,所以说这个时候,那么同学们我们呢,就得到这么一个结论。搁到这儿。OK,好了,那么所以说这行代码的意思相当于说入对的这个节点B,它呢就变成了我们的尾节点,好完了以后再来看,那么t.next等于no,那么之前这个T是尾,然后这个T它所指的也就是现在我们这个哨兵节点,这相当于还有个T啊这么一个引用,那么大家请看。
09:13
以前是什么T,这个no的前一个就等于这个T就是我们这个现在,现在这个T就是这个虚拟占位节点,那么下面这一行就是把这个虚拟占位节点的next设置为我的这个note,那么所以说得到这我们又得到了第二个,那么这个就是我们的。Next,那么至此我们呢,才能说这个B节点入队完成,OK,好,那么稍微改改这个线程,这个就是。顾客B。没问题吧,那么它的等待状态,那么也就是我们全部初始的零好。那么搁到这儿,我们来return t,完成我们这个入队的操作,OK,好,那么来。
10:02
一步步往回退,那么同学们请看,搞到这没问题了吧?好了,那么现在这个B就正式入队成功,那接下来我们呢,来看看。C它又是怎么入队的,那么来吧,搁到这儿我们就会明白了,啊,我这个线程B呢,现在呢,也就从这个大厅。那么A呢,办着业务呢,B呢就入队了,那接下来我们呢,回到脑图看看理论,来德维塔,现在这个B进来了,那么来。德塔这个模式就是B,是一种exclusive排他的,那么大家请看复习一下刚才所讲的,那么现在是不是B以这个模式叫no隔到这儿,那么完火以后这个B现在大家请看EQ,它呢,没有走这个刚开始的时候对吧,走的是en q好了,那么完活en q进来了以后,又是刚才这儿它是走了两次哦,一次是红框框,一次是蓝框框,第一次啊是拗了这么一个虚拟节点,对吧,也叫哨兵节点。
11:11
那么它完成了初始化,然后B在挂在哨兵节点后面,OK,那么双向列表当中第一个节点为虚节点,也叫哨兵节点,有些书籍把它翻译为傀儡节点,随便你了,我们这儿就称为虚节点。它呢,并不存储任何信息,只用于站位,通知各个节点谁出去谁进来,只是一种状态标志位的一个传递的媒介,后面我们会讲啊,它也有它的作用,那么真正第一个有数据的节点是从什么?第二个节点开始,也就是我们这的B节点,OK,好了,那么来同学们接下来呢?三号顾客,四号顾客,五号顾客陆续进来了,那么我们再来假设三号线程C他也进来了,那么根据我们的案例啊,所编写的源代码。
12:00
现在呢,B呢已经入队了,那么C呢也过了,还是熟悉的配方,还是熟悉的味道,那么这个时候C呢也就要想办理业务。搁到这儿。AC,那么从银行大厅看看这个情况来吧,洛克,那不好意思啊,我也希望我抢占成功,但是现在呢?A呢,占用着进不来这段过,那么C呢,AC快就在这儿TRY。和快得到这儿,那么找到我们的非公平所得。这个,那么来看看当前线程是谁呀?是cec get,塔几是一,一是否等于零,负不进来,那么一个是C,现在持有的是A也不进来,这块就是force,好说,那么现在这个方法是force。牵连它也是force,那么OK,整体而言,那么我们呢,都清楚。
13:01
这个是false,整体取反是错,那么我们的又进来,这个时候是我们的第三个顾客线程C进来,艾塔,那么来吧,跟刚才一样,这个呢就是C了,这个呢就是我们的什么。模式,那么现在是exclusive,这个是我们的C,好了,那么前置引用指针就等于为指针,那么相当于说就是我们这个节点BOK好了,那么现在这个为指针不等于烂吧,诶,确确实实已经不等于烂了,因为已经。自己溜了一个虚拟节点,然后。真实节点B都进去了,所以说大家请看入,对这个操作就是第一次的时候会被调用,后续只要这个不等于,那一般就进不来,这个好。下面C呢?晓得啦。窗口呢,被人占用,我也没办法获得锁,那么干脆排队乖乖的,那么现在尾节点不等于烂,同意吧,尾节点是B,当然不等于烂了,条件为错进来,那么现在P就是尾节点,尾节点就等于什么呢?就把尾P就是我们的T,尾节点的值是一样的,相当于说这个漏什么鬼,就是我们的C节点,C节点的前一个指针。
14:19
指向PP就是我们的尾,那么相当于说C节点的前一个指针就是现在的维指针,谁就是B,类似于。把我们的C节点也就挂在B节点的后面,好,那么同学们这个就是节点C,那么这个就是我们的顾客COK吧,那么其他的默认值都一样,相当于说。哥们儿,你呢过来,我呢也就给你呢。挂到这没问题吧,然后完了以后请大家看和刚才一样,那么比较并交换设置这个为节点,那么前一个节点现在是B,没问题,就要设置为新的,是不是就是C,那么这一行if判断了以后,那么同学们。
15:08
可以看得出很简单,那么现在新的尾节点是不是就是我们的节点C了?OK,好了,那么接下来告诉你,那么前一个节点,那么现在就是我们的节点B,节点B的下一个节点等于刚刚我们传见的节点COK,那么来吧,那么还是我们的next,那么这个时候得到这儿,那么来,同学们相当于说C节点是不是也就成功入队了?OK,那么来完了以后返回我们的noe添加入,对这个方法搞定成功,OK,那么相当于说在这儿我们是不是就把B跟C就A进去完全成功了,那么这要通过原代码给大家分析出他们是如何入队的,好那么接下来请看假如三号线程C。进来了,那么就是我们刚才的前指针。
16:01
指向我们的BC变成新的为指针,然后再把B的下一个节点指向我们的C,那么现在就是。虚拟节点节点B、节点C成功入队,我们的第二个方法,德维塔就给大家介绍到这儿。
我来说两句