00:00
各位同学大家好,接下来我们已经完成了爱的方法相关的源码分析步骤,表面上看就这三个,但是底层还是蛮复杂的,为了保证大家的学习效果,老规矩,小总结,OK,一步一步的来来看看我们这个爱的梳理一下,到底它是怎么做的,大家请看啊。首先他的这个一符判断写的就非常讲究,道格利大神就是大神。一般我们大家写if就做个判断,而它呢,不但是判断,还是递推型的。并且用某些业务方法作为判断的返回值活给你干了,判断也给你做了,所以说呢,写的非常的精妙。这样的思想。大家可以借鉴。那么来。保证大家消化吸收,学习懂,而不是讲完就完了,所以呢,我把上面做了一个梳理,每一步都给大家做了注释和文字上说明,实在不行了,还有。精济精简版,OK,保证大家消化吸收,味道满满,管生又管养,管杀又管埋,好同学们来。
01:05
这个那么也就是我们这儿的啊,我就不再反复切换了,肯定都是源码抓图的。做了一堆定制。As,那么就是64这个类当中的C单元格数组B,就是我们的贝value这个V,那么大家请看,比如说V等于a.value那么也就是什么我们运算的时候,当前哈希到CL单元格当中存储的一个值M我们在这见过了,那么就是长度呢都要减一,方便后面做哈希这相关的这个运算。最后这个A就是当前线程。哈希,到哪个槽位里面得到这个槽位里面这个cell单元格的值好,那么下面。我们来看首次定义了以后,首次来判断,我们都清楚,一开始这个隆埃达如果没有并发,或者在低并发下面就是这个贝斯类忙得过来的话,它本质啊就是个奥alone OK。那么我们只在奥米克勒这块,也就是我们在这个贝斯类这来进行运算,所以说刚刚开始的时候,我们得到这个速度不等于呢。
02:09
错误,根本就没有新建对吧,我们贝斯类搞得定的,所以说在这儿首次这个一定是false OK,那么我们呢,那没有这个数组吗?As就是那那不等于,那当然是falses了,所以此时我们就要走CS倍,以CS的方式更新我们的倍斯值,OK,那么更新我们的倍斯值如果成功了,这个CS返回处处取反,是false false false,直接跳出这个if第一步过。第二步。如法炮制啊,如果慢慢的并发上来了,这个贝斯类扛不住了,就相当于你这儿干那么多,我这个贝斯类热点越来越高了,扛不住了,所以说我们需要什么,分散热点,化整为零,新建我们的CE素组,那么这个时候第一个。CS贝斯是什么?False失败了,贝斯扛不住了,False取法是错。进入到我们的。
03:05
括号里面来进行第二个意思的处理,那么来下面UN contented意思就是无竞争,错就代表无竞争,False表示竞争激烈,所谓的竞争激烈是多个哈,多个线程都达到同一个槽位里面,那么这一个槽位也扛不住了,那么会扩容,所以说呢,现在我们1234过来,条件1C为空,那么只要第一个if通过进来,默认S当然为难了,说明什么?这个就是错,也即我们要开始新建我们。两个cell。OK,那么相当于是两个CL槽位,那么我们这儿呢,也看过源码,后续的这个我们详细讲下一讲讲,但是在这儿我们都清楚初始化了以后是不是六了。初始值为二的C单元格数组,好,那么相当于说这儿过来没问题吧,那么来吧。完了以后,只要这为错搞定,那么接下来再来,那么现在这个数组CL数组不等于呢错,所以说后面这个暂时用不到了,进来,那么各种这个呢,已经建好了,还等于那么false,而这个呢,一般不会出现也是false,所以是到这第三步就是当前线程所在的cell,从这个槽位里面算了以后,这个as啊,就是我们的as啊,这个S啊,也就是我们上面的CL数组,看完这个数组里面,比如说首次啊,只有两个坑位,零号坑和一号坑这个下标,那么来看一下我们是不是得到钠,如果得到钠说明这个里面。
04:35
有空间了,但是还没有值调用的aul,那么干嘛为空,说明当前线程还没有更新过,CL应该初始化exce,那么怎么初始化用它,但是假设啊,从这个里面拖出来的这个坑位,不管是零号刊一号刊都没有。等于,那那么这是false继续搁到这儿,那么下面就会变成a.CS那么来做。
05:01
假设这个A啊,就是数组里面,假设这儿就是一个零号开,那么这个就是相当于说我们的三零。等于等于钠不等于钠,OK,那么过来这又对它做了一个什么CSOK,没问题,如果这个CAS成功了,那么外面取反,这也是false if条件全是false,不进到这个long和开,说明当前的零号坑,一号坑这个热点是够用的,但是假设我现在啊,这个得到下标零号坑或者一号坑都不等于,那那么过了这儿,但是做CS的时候全是失败,也就是说现在并发压力太高了,两个坑外也扛不住了,那么要进入到我们的第三步,要进行扩容,所以说如果我这个零号看一号坑的这个热点,现在做CS是false,那么先明什么UN contented是false false就说明什么,表示竞争激烈了,听到那么一取法,False变成处进到这儿,说明我们要从我们开始的新建到后面的扩容,那么C数组将会从。
06:05
两个或一倍变成四个,OK,那么这个就是我们爱的方法的全部,那么相当于说也就是我们外面所说的三步骤,最初无进帧,只更新贝斯,贝斯不够用,新建一个CL数组,如果多个竞争同一个CL数组里面也是比较激烈,那么就要对CL扩容好,那么。完了以后再过来,这就四句话给你搞定。第一个最简单版的啊,里面是中,就可以这么说,C如果是为空,那么我们呢,如果这个表为空,对吧,说明根本没有新建,那么这儿是force过来,这儿CS base斯成功了,那么相当于说贝斯类加个C成功退出,第二种还是没有新建这个cell呢?为什么CS base斯这要来决定走到这儿,如果这个CS成高,那么加到base斯,如果不成高,对不起,说明出现竞争了,那么现在我们要调用。第二个系刚好这个C要数组等于,那还没有新建呢,搁到这开始新建初始值为二的一个C要数组,第三步搁到这儿,现在已经新建好C数组了,不等于呢是出不走,后面直接进来这个false,这个false那么相当于说现在这个C数组表非空,但是。
07:20
当前线程映射的槽是为空的,那么这块uncontened就为处为调用这个long ACA的方法,那么相当于说什么,如果是为曹为空,那么也就是说这块还没有被更新呢,加进去,OK,那假设啊,现在呢,这个槽呢?不为空到这块。当前一射的草不为空,但是CS更新的值如果是成功了,那么就是加到零号看和一号看,说明够用,如果不成功,说明已经有冲突了,是为force要调用,这个代表是扩容,OK,好,那么同学们,这个就是我们对爱的方法底层源码的分析步骤讲解和最后的总结。
我来说两句