00:00
讲解完成,那么这样如果是副词呢?说过了这个force啊,整体区房是不是处的话,是不是叫往前搞,那么就要进我们的艾,所以说来到了我们的执行排队的这个逻辑,艾德维塔加入队列来到了我们的什么第二部分来同学们这部分的逻辑是尝试获取所失败的情况下当前队列。那么准备来办理业务的已经看到了,这个银行窗口是红灯,有人占用这业务窗口持有锁了,我挤不进去,我只能去排队,那么当前线程就是我们来办银行业务的顾客封装成no的对象,加入到我们的这个队列当中,那么就是我们的第二块来,同学们还记不记得这个方法我们是不是强调过?二跟一到底先执行哪一个呀?那么下面请看啊,将当前线程封装成node对象,并加入到队列排队,首先啊,根据队列排队以及是否初始化过,那么执行一二是不同的逻辑,这个时候一表示队列不为空,就是初始化那种。
01:04
动作已经完成了。那么此时。只需要将新的队列加到队列尾部即可,但是R这个逻辑大家还记不记得,我们讲过,ENQ就是入队,它这个是真真正正完成队列初始化的,那么键我们的哨兵节点就是站位节点,再加入我们的第一个元素,那么所以说二这黄色这块就是这写的,表示排队的队列是为空,需要执行队列初始化,这个时候它会你用一个空的no对吧,作为排队的队列had,哨兵节点,站位节点还记得吧,所以说各位同学请看。都来看看这个tell前置节点P等不等于,那那么刚刚开始。这个怎么着,我们呢,肯定是。没有嘛,对吧,那么所以说如果说这个force就不进来,那么先执行这个二,我们要先完成初始化,大家还记不记得这一段注释,Must初始化,这个有印象吧,所以说现在没有其他线程在排队调用这个EQ构造队列,并将node加入到节点,那么这个时候返回no,那么1Q方法我们同学们,我们强调过,比如说一开始T就等于TT付给这个TT等于等于代吗?当然等于了,一开始什么都没有,所以说初始化,注意这是不是六了个漏,对吧?然后呢,首尾相接,那么这个时候同学们。
02:30
这一行执行完了以后,就是这么个造型,AKS2个属性,头和尾分别来保存AKS队列的头尾节点,对吧?这个呢我们也说过,这个呢相当于说粉红色的,这个就是六出来的站位哨兵节点,然后呢,第二次。它呢,不等于,那呢再进来,那么T的这个节点的前一个,这二号节点的前一个就是这个TT呢,现在前面这个是不是指着我们的这个尾,对吧?然后再把它T设置成node,那么加入进去以后,二号这个节点node n2变成新的尾节点,然后再把T的next指向这个no,那么它们两个呢,入队成功,好,这个分支走完,然后完了以后,那么大家请看。
03:16
这个二结束就是右下角这个啊,再回来那么。敲击这一块,那么如果是错,执行上图的步骤,这个一队列已经初始化完成,将no的加入到了队列的队尾,那么这样的话,第一种加进去,返回node,第二种呢,那么来我要挨个挨个的第二个也要进来了,比如说A。是去窗口BCDFG都按照这个流程来,那么加入了以后就要走这段黄色的一号,那么。他做的事,这个队列表示节点N3,那么前截前指针指向二,然后二的尾指针指向三,然后尾节点指向这个,那么也就是我们强调过的为next,然后OK,好,这个就是我们的第二部分,那么挨个挨个这样他们进行排队成功,那么最后来到了我们第三部分,那么这个时候。
04:14
这部分的逻辑是noe加入队列号的处理逻辑,会有一次自选尝试获取锁,就是还记不得我们说过的这个,所谓的这个叫再强强,还记得吧,那么获取不到才会调用帕阻塞自己真真正正的作文了。好,那么同学们来吧。搁到这儿。这个节点过来了,那么我们acquire q的塔讲完了,来到第三部分,执行这个park,但这块返回表示线程获取到锁,线程逐级返回,加锁过程就结束,但是这个帕怎么弄过来的呢?来吧,同学们还记不记得这个?我们强调过try finally,对吧?TRY是正常情况。Finally,如果这个fail是true的话,它是异常情况取消对吧?那么正常情况走这个,如果没有走到这一行,Fair没有从true变成false,那么就会走到这那么正常流程,这是一个负的大循环,对吧?有should的park after,还有这个park,我们一再的强调过,首先来判断。
05:21
我们这个for是个大的多次的循环,对吧,类似于Y处判断这个no的节点的前置节点是不是害的,那么P等等害的那么假设啊,我们原来说过这个A要办完了,B要过来,那么P。等不等于had的有没有有,如果是说明它是下一个可以获得所得节点,那么我们说过,假设这个哨边节点的下一个是不是原来我们的节点B,对吧?好,还对应的上,那么。它呢,这个B在这个里面呢,调用一次try a快俺说过的这个,哎,填填俺是获得所,若获取到,那么列表关系重新维护一下,对吧,那设置为had之前的had链表移除,然后返回,但是如果前面节点不是。
06:08
Had或者是获取所失败等等啊,那么这个时候同学们这段代码我们是不是说过。假设这块是force抢,再抢抢失败了,那么只能走到这儿,那么should。Park after field acquire,并且park and check interrupt,那么这段非常的重要。这段的方法我们来详解,小说明注释在这主要还是看这个东东,那么来同学们就是两大方法,一个是should park after fail,那么我们来看看它是不是头节点,然后再过来,那么try acquire就是这儿啊,首先是不是头节点,然后是主要是try acquire的true和false,如果是戳这个是戳这个是戳进到这个if,如果这个是个false,那对不起,走下面这个if OK,那么所以说我们在这儿try acquire是first,那么走下面这个if就是我们的if。
07:06
Should park这个方法OK,那么啦,在搁到这儿还记不记得我们要进来两次啊?这也给大家写了这个方法接受两个参数,No。对象参数,参数二是准备执行park操作的那么节点漏的参数一是其前辈节点,我们第一次进来,我们说过。再复习一下为的塔默认值是多少?是不是零,零等于C格吗?零是不是等于负一,当然不等于了,所以说呢,怎么着return处这一段不进来,然后零大于零嘛,当然不大于了,对不对?那么所以说L的话,我们造到这,那么是会会把前置节点的位置的状态从默认的零改为西格负一,所以说它又再进来一次,那么负再次循环判断完了以后,这个时候又进来,那么的wait特塔等于几了,现在是不是已经由上一步啊改成负一了,负一完了以后怎么着是不是错,果不其然。那么所以说两次来了以后,第一次这个是负,第二次是这个是错了以后是不是进到这个park and check interrupt,那么来如果是处了以后park and。
08:10
Check interrupt,那么来吧弟兄们,这个呢是大家最熟悉的对不对,那么。隔到这儿lock support park,那么这个B或者后面的CDFG挨个挨个呢就停到了这没问题吧,那么刚才所讲的两次的这个过程,我们前面也讲过,在这儿也给大家进行了相关的处理和总结,OK好,那么最终那么这个park阻塞,我们就再次循环判断,那么搁到这了以后,直到是有人按lock了以后,再把我们这儿唤醒,我们再参与下一次的抢夺,OK好,那么同学们所以说。说到这儿了,以后我们大家呢,就会清楚。就是这三大步。第一步。那么我们呢?直接呢?安是加锁,加锁失败,我们呢,进入到队列,进入到队列以后,我们再进入到阻塞状态,在队列里面好好排着队,然后等待这些状态的变化,唤醒了以后办理相关的业火,OK,那么所以说分为123,这个就是我们全部加速的状态,好,那么感谢各位的聆听,请大家务必下去照着我们之前的源码分析这个思路,挨个挨个的过一遍,增强自己的内功,谢谢大家的收听。
我来说两句