00:00
我们前面强调过,我们当时讲的时候是走的是非公平所,所以没有过多的。详细讲解过这个方法,大家还有印象吗?那么这段笔记对应着这个方法,那它到底是什么意思呢?来,同学们,嗯,我们找一下啊,还记得这个吧。来同学们,我们当时呢是re lock对吧,然后呢是非公平锁,公平锁,然后完了以后大家请看,还记不记得左边是公平,右边是非公平,我们当时为了讲课流程的完整性,我们走的是非公平所,所以我们并没有深度的讲解这个方法,而且这个方法其实也不难啊,大家请看这个方法就区别就是说来判断等待队列当中是否有人在排队。那么在这。123几乎就是三四行,那么注释也写的很明白处,那么就是说在这个队列的这个线程里面,之前有排队的,在当前线程之前false的话,那么就是当前这个线程它就是头节点,或者说这个队列是个空的,OK,好,那么接下来我们来来说一下这段好吧,所以说呢,在这儿。
01:14
我们呢,原来走的是非公平锁,那么现在按照我们的笔记,咱们呢走走公平锁,这边简单的给大家说一下这个方法,先说流程,再说源码,源码也不难,就这么几行,来,同学们过来吧。前面我们也讲过,二主要就是个cns操作吧,是当前线程,还记不记得原来我们说过,假设B线程进来,或者A线程进来,C线程进来,都得是try acquire,尝试占用,先说流程吧。TRY块方法get等不等于零,那么等于零是自由,不等于零表示占用,有印象吧?那么下面我们来判断一下,假设啊,我们在这儿,不等于零表示有人占用了,那么。A占着这个还记不得,我们说成红色,然后这个没办法了,接下来呢进不来,所以说这个C我们只能是什么走下面判断之前是不是当前线程获得到了所。
02:14
这儿就有一个什么重入锁的原理。如果否,整个TRY块返回false表示获取所失败,如果是,也就是在这儿,If l if当前的,也就是所持有的,那么这是重容锁的实验原理,是啊,那么。设置重入锁的计数器,整个串块返回处表示获取锁成功,OK,那么这个呢,是通过。Get这个C这个值来判断占没占,以及是否是重弱,这块我们都说过啊,那么假设它这个是零,就表示所为自由状态刷成绿色的,OK好了,那么绿色状态啊,就相当于说如果是。等于零就要走,这个分支就是if,这个分支就进来,那么进来以后肯定会遭遇has q的predecesors,这个判断之前有没有人排队的这个方法他有注意这是区房啊,出和force是个不管方法,那么来吧。
03:10
搁到这,待会我们说圆码如果是false,那么表示什么?无需排队,那么执行CAS什么意思啊,就说如果这这个方法是false false取反是错错往前走又执行我们的CS啊,那么这个是不是就。跟我们的非公平锁这个CS是一样的,大家看compare and set state,这两个是几个方法,区别就是二,好,那么回到这儿了以后来继续。这个是false啊,执行这个如果是它执行false CAS,那么在这块本身就是false false取法往前走,所以说取执行CSCS是false,那么整个穿越块返回false表示获取所失败,但是如果说在这块执行成功呢,就是。它也是first整体取反是出往前走,那么这个CS。
04:03
要么抢成功上位,要么抢失败,所以说在这儿如果说是处调用这个设置当前线程的所持有线程,那么整个返回处表示货索成功,OK,那么这个分支过下一个分式,如果在这块它就是处呢?那么表示处需要排队,整个TRY快方法返回false表示获取锁失败。好,那么咱们先走流程,咱们。流程走完了,注意啊,一定要注意就是有没有,然后前面有没有,然后在CS的操作就这么简单啊,也不难,那接下来。流程走完了,兄弟们,我们来过过源码,这俩源码呢,大家先看一眼啊。不难,那么判断在当前线程前面是否已经有其他线程在排队了,有则表示当前线程也要排队,就是判断有没有要不要排队,就这么简单来。
05:00
头为节点S等等,那么这就有一句话,那么首先这个has q的predecessors,看看这个队列里面有没有排队的这个方法执行流程首先在高并发多线程里面。我们先要判断他们有没有完成初始化,这个队列有没有起来,下面先走,没有,那你过来的时候。干嘛队列都没有呢,你可以把它理解为你就是第一个对吧,所以说呢,再过到这此时队列还没有初始化呢,则H是不等于T返回这个false根本就没有对吧?也谈不上什么H这个T和T之间的相等这些问题,因此此时H等等,T等等,那因为是个nu嘛,对吧,你看开始的时是都是nu,所以说整个方法返回这个false表示不需要排队,那么。干嘛初始化这个问题?那假设已经完成初始化,那么就要看看这个队列里面的元素,那么元素个数大不大于一来。
06:00
我们先来看啊否的这只否,那么元素个数不大于一。听到完成初始化了,那么这个这这这个分支了啊,已经是那么不大于一,说明对列元素里面等于一,那么当最后一个排列线程也得到所此时H等于T,那么也就说只要有第一个节点加起来只有一个节点,那么头尾是不是都指向同一个啊,那么所以说它呢,就这样那么。完了以后它是这样的啊,H不等于T出跟first,然后决定往不往前走,然后下步又是什么?H的下一个等不等于,那然后当前这个节点这个no s的线程等不等于这个当前的这个OK,所以说是三段判断,那么继续。隔到这儿了以后。我们的初始化完成元素等于一,好,那么H不等于T,返回的是false,那么不好意思啊,整个返回false表示不需要排队,好,那假设啊,元素个数大于一是二,那么就是已经完成初始化,并且个数还高过于一了,那么。
07:03
队列元素大于一,对列元素大于一,则至少为两个,H就指向下一个。节点,因为这样如果只有一个元素头节点的下一个答案是钠,但是如果有两个元素头节点的下一个还会就不等于钠,OK,所以说。那么H的next指向第二个元素,肯定不是呢,所以这一圈就返回false,那么最后返回false,好,我们再看看这个,或者这这是个,或者还要走到这一步,那么这呢,就看看是不是当前线程出跟force的一个判断,如果是错两者。也就是说S点12的这个S是个no啊,不等于当前线程的,那么错两者不相等,说明下一个可以获得所的线程不是当前线程,所以整个方法返回。错表示什么?需要排队,但如果是false呢?A是第二个节点啊,第一个节点是占位那个空节点,我们说过了啊,就是这个,然后呢,代表下一个应该获取所得相乘,这个为false,表示两者相等。
08:08
那么。下一个可以获得所的线程就是当前线程,所以此时整个返回falses表示不需要排队,OK,好,那么也把这个过了一遍,也算是对这个前面讲过的一种补充,那们希望大家呢,彻彻底底明白,OK,那么接下来我们呢,就要进入到我们的第二个阶段,那么就是尝试加锁已经完了,那么第二招加锁失败,就要进入到我们的现成的这个队列里面,看看我们的艾德维塔这些后面的一些方法。
我来说两句