00:00
好,同学们,我们继续,那通过上面的讲解,我们现在是不是就明白了B是怎么进来的,那么变动一下,现在这个B是不是就A维塔准备加入到这个等待队列了,这一波能跟上好,后续还有更多复杂的,我们待会儿再说,那么我们继续来追这个源码么?现在return这个T相当于说传进来的这个B是不是开始被加载进。我们的这个A塔这个方法里面这过来了,这一波能跟上好B。直接。入队了。那么接下来。按照我们的流程,B后面是谁呀?是不是我们的C就是第三个顾客,那么他也是这么一样的啊。那么C呢,也是如法炮制啊,他去踹和快啊,现在C能不能抢到也抢不到,跟刚才一样,C现在进来了,怎么着也看哟,这个A是不是也站着窗口,那我也只能是去银行的什么等候区,是不是我也要像B一样的准备加入队列,哎,维塔这个方法同学们这一波没问题吧,那么它呢,将会如法炮制,重复第二个线程B。
01:19
相关的业务逻辑和流程继续入对,那么现在C去抢TRY快抢不抢得到抢不到是false false以后取反,这是处处的话往前走。那么现在第。三个顾客C那么抱歉也没抢到,是不是要艾维塔他也要被加入队列?C进来。那么当前这个是谁?是C,我们的第三个顾客,他的模式是什么?是不是也是这个exclusive,好,现在这个就是我们的C顾客,但是抱歉,C。和B不一样,B的话是里面什么都没有空的,但是C进来的时候是不是里面已经有两个节点,哨兵节点和B节点了,那么接下来我们请看。
02:09
C节点进来了第三个顾客。P的等于T,那么相当于说有一个值,现在这个的也就是这个维指针,它说也就说你就记着这个P就是维指针,那么现在告他来判断为指针不等于烂,大家请看。不像第一次B进来,B进来的是为指针,是指向这儿,有个那什么都没有嘛,但现在已经成队列了,所以说我们现在的为指针指向着谁,指向着B,那么所以说这个为指针当然不等于烂了进来,所以说现在这个C呢,它是这么干的,C也要入对了C的前一个。指针就等于这个PP就等于太阳,那么现在太阳你指向什么?是不是指向着B啊,那么你懂的,这个我都不废话,一说你就会清楚,意思就是我们现在的C。
03:02
初始值的等候状态也是什么零,那么现在这个顾客就是我们的线程C,那么这个顾客就是线程COK,那么线程C他说了C的前指针等于这个P就是为指针,为指针现在是不是指向这个B,那么我们就得到了。这个,哎,我。它的这个前指针preview,那么就是它好的,那么继续,然后呢,比较并设置为指针,相当于说现在排到最后的就不再是B了,就应该是什么是我们的C了,那么所以说我们希望为指针。然后变成新的这个,这现在新的这个是谁,是不是就是我们的C呀,所以说这个为指针,那么现在又发生了变化,入对了以后,C就为指针,就从原来的B指向了现在的COK,好的,那么。接下来继续,那么我们的P为那么走到这个时候,我们都知道啊,这个P是不是原来的那个为指针,就是我们的那个B,它要告诉你,请把B的next指向这个no,现在这个noe是不是就是我们的C,所以说跑到这了以后,这个。
04:20
Next。就是指向了我们的C,那么同学们这一波好好理解吧,所以说我们的C进来了以后,它没有进这个en q这个方法上面就给你搞定了,是,也就说后面的节点就是走这么一小段,只要为指针不为空,说明已经队列里面已经有元素,那么我们就该干嘛干嘛,那么noe的前一个就等于我们的尾指针入对,然后比较并交换一下,把尾指针弄成新的,然后。以前为指针的就是我们的这个B的下一个,这一波能跟上,那么你看为指针的下一个P是不是为指针,原来的为指针是指向BB的下一个就等于现在这个C,那么return这个node让C也就入对好,那么同学们如果后面再有D。
05:08
EFG,那么是不是也就这样如法炮制啊?那么现在同学们回答我头指针指向这个节点为指针指向,最后入对这个是不是慢慢的我们就形成了我们的队列呀?OK,这个就是ABC3个元素入队的情况好。那么我们回到我们的老图,简单的来看一下,呃,快尔方法那么大家见过了,那么我们来梳理一下刚才我们的源码和三大流程走向,第一个我们刚才说过了TRY。ADD和蓝色,这我这儿有个红色,这有个绿色,这有个椭圆形的蓝色。Acquire主要有三个流程,123好,我们尝试try acquire,那么交由子类的。公平所实现或者非公平所实现,我们这选的是非公平锁,这个没问题吧,这是第一步,那么出A快啊,你抢得到,如果这个返回的是处,说明你抢到了,那么处取反就是false直接跳出,如果B跟C没有抢到,这块返回的是false force取法就要往前走,往前走是不是我们的ADD维这个方法这一波OK,那么接下来。
06:21
一样,那么我们呢,完了以后在这块艾块也好,我们是不是有,我们刚才看到过这块有ENQ操作,代表B就准备入队,操作完了以后,我们再往下来看的就是我们的第三个方法是不是艾维塔,现在就是。BC是不是都成功入队了,那么好准备进来以后,然后我们要看看我们后续第三个方法acquire q的准备是吧,占用这个队列,正式进入后口区,第三步就是调用这个,那么这就是他们的1233大流程走向,说白了就是底层这三个方法的调用好,那么接下来我们的try acquire,那么这个呢,也已经说过了,我们本次啊,走的是非公平锁,那么强调过了try are,那么走的是。
07:08
非公平锁,那么最终这个try acquire源码里面走的是这个方法,好,那么。这个方法我们走下来,我们大家都看到。过来了以后,这是不是要get,看看这个状态是多少,这个状态如果是一就不可以说明有人占用了,那么。是不是?自己这个线程是不是可重入锁,那么如果是返回first,那么你清楚的first继续推进条件,走下一个方法塔,否则return错就是结束。OK,那么好,TRY,这个完了后,下面这是我们刚才所演示的。BC2个线程,德维塔那么强调了啊,它的构建是这个,那么现在呢。这个ear。进来了以后,那么同学们请看,我们假设以B线程进来,当前线程是B模式是exclusive的这个,然后的话,它是入队第一次B是走这个C可没走这个啊,那么B进来了以后,我们就会发现先Q了以后必须要有一个尿尿的话,这个是不是一个空节点,也就是我们的傀儡节点,哨兵节点,第一次啊是完成初始化,第二次自旋了以后才是把B入队,然后return这个B。那么所以说我们这。
08:24
明白双向链表当中第一个节点为虚节点,也叫哨兵节点、傀儡节点,并不存储任何信息,一定要注意AQS里面它的首节点是哨兵节点。只是用来占位,真正的第一个有数据节点是从第二个节点开始。那么是不是一。二三清楚,那么整个流程我们呢,就说到这儿,三号线程C进来了,那么刚才也看过了前接点,那么C入对就是什么前接点是这个B,然后把C自己。
09:00
设置为尾节点,然后又是什么next b节点的下一个节点指向我们这个C完活,那么所以说同学们这个就是我们的BC入对的前面这四个方法,那么后面的就更复杂,那么希望同学们坚持住,跟着我把这个整明白。
我来说两句