00:00
各位同学大家好,我们继续通过前面的讲解,我们以非公平所re look。洛,按洛方法为例作为突破口。通过源码的讲解,我们呢,画着图,照着源码一步一步的带大家进行了深度的分析和详细步骤的讲解。OK,好,那么对于入队。出队各种等待唤醒线程,还有wait特斯各种状况的迁移变更,给大家做了详细的介绍。但是实际工作中。实际生活中哪有这么顺利来,下面我们看另外一种情况。源码和三大流程的走向分析。来回到我们原来的笔记。红色、绿色、蓝色的,我们的acqui方法,这三个方法都给大家说完了,那么三条主干流程都带着大家进行了深度的讲解,可是别忘喽,我们这儿是不是还有一个cancel还没给大家讲啊?好的,下面呢,我们就来说说从正常情况到我们的异常情况。好,那什么意思呢?各位同学请大家看。
01:11
我们呢,大家都清楚啊呃,回到我们的源码分析这块呢,是acquire也就这个方法。他在这儿的时候尝试进入队列,我们在这块有一个负循环,这个是正常的,可是保不齐它可能有中断,各种异常,有没有走到866行。Fail first,我们大家都晓得这是一个try finally,如果fail它默认是什么,如果这个true的话,它是要走这个流程的,所以说我们取消流程,将会在这一节给大家进行详细的介绍,那啥意思呢?默认是失败的,Try finally进来,我们要取消。通过前面的讲解,我相信大家对这张图是非常熟悉了,应该搞得懂了。
02:01
正常情况下大家一二三都排着队,但是突然有一个,比如说三号节点对尾这个啊,哎呀,排银行的人今天特别多,我还有其他事儿,我不想办了,我取消,那它是不是自动的要从这个队列里面消失,那么如果这个队委还好,如果它是。中间的呢,那么相当于说按照原来的流程,一的下一个是二,二的下一个是三,123的队列排列,但是现在二号节点要走了,那你告诉我这个时候是不是一号节点的下一个将要从原来的二指向了三,来进行我们节点的变更啊,所以说这样的情况下,我们呢,就要注意这些取消流程,好那么同学们,接下来我们呢,就来会一会我们的取消节点这个流程,模拟某个队列的节点。不想等了,自己要取消上面这个呢,给大家进行演示过。好,下面我们还是这样,下面的虚线模拟银行的候客区,等候区,每个线程就是一个顾客,好吧,那么虚拟头节点好说这是个假的,那么节点2345,那么对尾节点就是五,那么中间节点就是234,那么下面呢,我们模拟两种情况。
03:14
第一种先带着大家走简单的对尾,这个节点要离开了,那好说next指向那是不就完了,那么把这个指向这个其他的不变,那么第二种情况呢,是四号节点,就是在中间部分的。要走了,那么假设四号节点要出对,那么是不是三就要从原来指向四改成三指向五能跟上,那么当然第三种情况更复杂。有可能一走不是走一个,他是走一片,意思就是四号节点先要看守,取消三号节点,这个顾客一看,哎,我也不想等了,干脆我也走吧,那么四号节点要走,三号节点也要走,那么四号节点之前的三号节点他也要走,那么三号节点之前的节点二号节点刚好不走,那么说明什么?可能我二号节点的下一个节点就要指向五,我五号节点的前一个节点就要找到我前面节点,前面节点的二号节点。
04:10
OK,好,那么这个理论上先带着大家呢说一遍,那么接下来同学们源码说话,来先说第一种情况,最简单的假设对尾节点,那么假设按照我这个图啊,五号节点。来吧,这个漏就是五号节点,那么除不好意思啊,可能因为某种异常或者是打断,那么没有走到866行,这个fail没有改为是错,If finally就要进来取消。现在这个节点是五,我们这次先讲最简单的啊,五号节点刚好就是个对尾,那么来吧,下面看五号节点等于捺吗?如果等于捺,直接探五号节点不为钠,这条不进了,下面。747行开始五号节点,这个线程等于,那那么好,我们这儿呢。说明的意思就是五号节点这个线程他要取消嘛,我这个人这个线程就是个顾客,我不办这个业务了,所以说这个线程等于那过,那么接下来请看。
05:12
五号节点的前一个节点。是不是就是四号节点没问题吧,那么好,当然啊,我们就是讲清础啊,由于有了前面的基础,我们节约时间,这些指针的变干我就不再画了,我们直接拿这张图带着大家说清楚啊,那么好,五号节点的P的前一个是不是就是四号节点,OK,好,这是P的Y,要待会我们会来说这个Y啊,是什么意思啊,那么假设四号井的维塔塔要大于零,啥意思呢?就是说。大于零,你看在这儿零负一负二负三只有一号。是can对不对?只有数字一是can,意思就是说假设Y啊。五号节点的前一个是四号节点,四号节点的wait要是一的话,也就是四号节点也要取消的话,那么咱们呢,再进入这个里面,但现在四号节点我们默认不取消,这段不进来,待会儿我们会说,那么你就给我记着。
06:10
五号节点的前一个四号节点,好,下面请看,那么next前置节点的下一个它呢?作为后面的CS啊,需要完成这样的操作,好,那么来所谓的S就是指这个方法啊,766行这个来,那么现在五号节点。的前置节点是四号,四号节点的下一个五号,那么next就是五好,那么现在noe。那么no wait改成什么?Canl,相当于说这个五号节点,我自己不想等了,我要出去,我把我这个wait从零改为我们的一,也就是我们这的。Pencill OK,好的,我们继续,那接下来if这个方法,No节点是它节点吗?将将好,我们这次啊,五号节点从最简单的入手,刚好就是对尾节点,他要走好了,那么接下来。
07:07
过来,这个是错,继续往前进。比较并设置尾节点,那么由于你五号节点要走,那么现在对尾节点是不是要变成四号节点,所以说同学们请看,就把五号节点。希望值是五号,你看如果我们是节点的话,Remove ourselves把我们自己拿走。那么就。五号节点的。前置节点。那么请问。五号节点的P的前置是不是四啊,意思就是说五号节点要出去,就把四号节点设置成什么尾巴,相当于说这个真真,那么从五号,诶抱歉,那么相当于说这个真真,由于五号节点你是不是要走了,那么这个真。那么我们呢?直直接呢。稍等啊。不是要将会从我们的五号节点指向了我们的前面这个四号节点,OK,因为你五号要走了嘛,好,那么这个过if进来,接下来我们来看一眼,那么P前面强调过这是四号,那么四号节点的下一个是不是五,那么compare and set next又是一个CS操作点进来,可以看得出note是几,Next ofet下一位的偏移量,然后期望的和变更的,那么这个时候一看都明白他的意思,什么鬼,相当于说把。
08:31
那么现在五号节点的前一个是四,那么这NEXT4号点下一个五,那么是不是把四号节点,那么它的前置的下一个就是五号节点设置成什么,设置成空,那么因为你五号,那么前置节点的下一个是不是就等于呢,代表五号节点彻底出对完活,OK,那么当然这个if。走了这个L就不走了,OK,所以说这是一种。特殊情况,那么呢,相当于说把五号节点呢,这个的这个下一个呢就吃成了,那么这个时候对尾的五号节点拜拜再见,好,那接下来啊。
09:10
第一种情况完成它是对尾,它有点特殊,那另外的情况呢,那么同学们。我们呢,大家都清楚。假设现在不是对位节点,更复杂的是四号节点要出对,那咋整呢?请看源码,现在节点是四号,四号不等于呢?不进了四号节点等于那。那么现在我们模拟四号节点。它是一个中间节点,它不是对为哦,他要出去了,那么他出去这个县城就是一个顾客,那么自然而然,这个顾客是不是为难好说,那么大家请看四号节点的前一个。是不是三号节点没问题吧?好,它的意思是这样的啊,如果正常情况下这一段是不进来的,那么另外一种不正常意思就是说更复杂的情况就是四号节点取消的同时,三号节点也有可能取消,那么假设啊,现在四号节点的前一个是三号节点,假设三号节点的wait刚好你四号要走,我三号也要我们两个同时取消,那就有点麻烦,请看那么三号节点的位置假设是一一大于零嘛,那么进来。
10:25
Look,这个时候关键重点四号节点的前一个是三,三号节点的前一个是几?是不是二,再把二号节点付给四号节点的前置节点,那么意思就是说,假设四号节点要出来了,那么四号的前面前一个是不是就是三,这是正常情况,那更复杂的情况。四号节点要出来,三号节点也要出来,那么四号节点的前一个,那么又是三号节点的前一个,那么就是二号节点,相当于说跳两步到二。
11:00
总而言之,就一句话,要找到前置节点是非取消状态的那个,稳定的那一个OK,所以说这段代码就是找啊找啊找啊,前一个的前一个OK,往前拱,一直拱到前面那个状态,不再是取消就行。好,我们再说一遍。现在。是中间节点,四号节点,四号节点的前一个是三号,如果三号是非取消状态,我们继续往下走,假设三号。和四号一样,四要走了,三也要跟着走,那么来吧。四号节点的前一个是三号,假设三号节点的状态也是要取消,我们来吧,现在三号节点的前一个是不是就是二号,那么再把二号节点付给四号节点的前一个能跟上,相当于说四号节点就因为三也要走的话,四就要指向二,总而言之,就挨个往前找,找到前节点不取消那个好,那么现在啊,我们过来,四号节点的前一个是三号,那么。
12:03
复杂情况刚才讲解过了,那么假设现在三号节点不取消,那么只只取消四号节点往下走,那么四号节点的。下一个,那么同学们是不是五号节点,那么有点类似于说前面啊,四号节点前一个是三。这么说能跟上好,那么三号节点的下一个是不是就是四号没问题吧,那么三四他们两个互相指向了,那么p next。也就是我们的是吗?三号节点的下一个就是四号,那么这个是三,这个是四号,好过到这儿再把四号节点中间这个节点的状态。改为出对cancel取消,我不想等了,不想办业务,那么现在IF4号节点是对尾吗?四号节点当然不是对尾,对尾我们刚才讲过了,那么过,所以说现在走进这个L。来WS是wait的状态,那么的前置节点不能等于头,因为我们晓得前置节点是个虚节点对吧,所以说这种出对主要就是。
13:05
队列的中间部分和特殊的一个情况,对尾好,它不是对头,没错吧,并且我们来同学们请看这有一大段if的条件判断好,那么。我们大家可以过来这个P的,我们前面强调过,现在我们以四号节点出来,这个P的就是三,OK好了,那么这段条件假设满足,我就不挨个挨个过了啊,就是只要不是头节点,并且可以去满足出对的话,那么就进来这儿有一个判断,那么现在这个node是谁?那么四号节点的下一个是几?是不是就是我们的五号节点,所以说你看它的意思就是说四号我出来,那么三从原来指向四号就从三。指向五,说穿了就是把这个续接起来,OK,好,那么过来这那么next就是我们的什么,这个节点是四号,四号节点的next就是五,那么五。
14:03
不等于那吧,现在四号要出去,五号节点在的OK,那么并且五号节点wait塔小于等于零,OK,它没有出现什么意外,那么假设小于等于零,这么说能跟上是这些状态的话,那么进来。那么compare and set next大家都见过了,那么来这个是什么什么什么鬼,这个P在哪儿?有的我们说过四号只能前一个是不是三,那么四号是不是是不是就是三,三号节点的下一个是不是就是四啊?那么它的意思就说现在三号节点的下一个,原来三号节点的下一个是四,你请看这个P是不是三号节点的下一个是四,改为set next,就把三号节的下一个从原来的四设置为next g5,因为四号节点的下一个是不是就是五,所以说就完成了什么三从原来指向四变成了三。从原来的指向四指向了NEXT5,因为四号技能下一个next就是五,OK,所以说就完成了这样的一种变化,好,那么。
15:07
这些改变了以后,最后大家请看四号节点的下一个等于什么node有点类似于什么四号节的下一个就指向自己,那么最终就完成,还有普及C,那么我们呢,就可以得到了,奈是五,四的前一个几是不是就是四的前一个是不是就是三,那么这样的话呢?我们呢,就完成了,三指向了我们的五,中间这个四前一个没有了,下一个指向自己,那么头尾都不指向,那么OK,四就正常的出对,拜拜,OK好,那么各位亲,这个就是我们的一种是吗?刚才所。给大家强调的acquire方法里面的最后这一步,这个TRY是正常情况,这个finally是失败了异常情况,那么最终对应着我们的大纲合拍了以后,三大流程走向按照我们这样条理分明,步步为营,一步一步的带着大家进行了详细和深度的讲解,OK,好,那么大家呢,不要着急。
16:12
最后,杨哥的全系列脑图再给大家做一次最终的总结,OK,那么有兴趣的朋友一定要跟着我们的视频和步骤分析一下这个源码,对你提升内功有相当大的好处。
我来说两句