00:00
好,各位同学,我们继续。接下来我们将会对。这个里面最复杂的这一段就是CASE1,这个情况呢,给大家进行详细的拆分,那么大家请看啊,它的光是看那么多l if,你也会头疼吧,我第一次读的时候也是很痛苦的啊,那么这个时候呢,还是那句话,做难事必有所得,请同学们跟着来。那么下面我们就要演示多个线程同时命中同一个cel的各种竞争情况,什么时候写进去,什么时候扩容,啰嗦着呢,那么下面我们按照走。三走三次给大家介绍,那么大家呢,不要担心,那么下面先来总体看一下,按照总分总的学习方法,这是K1SALES已经新建初始化好了,那么我们来看看怎么在已经就比如说现在呢,有零号刊,一号刊甚至更多的刊啊,那么下面呢,怎么给它写进去对吧?那么甚至现在假设有两个坑,怎么有扩容的好,那么下面这个知识已经被初始化。
01:00
那么全部的代码有这么多,来吧,我们现在呢,先回到我们的源码,那么下面这堆爱的都晓得啊,那么现在假设我们呢,这个as。现在呢,这个呢已经建好了,不等于难对吧,过来这那么假设跑到这以后第一种情况。假设我们这应该。现在呢,是有零号刊和一号刊,那假设现在是一号刊,一号刊等于,那么当然不等于了,那么因为一号刊是吧,不等于,那而且里面也有个值啊,我们现在呢。直接呢,等于那是false false了以后就会走到这,那么对于一号坑的值,假设这个一一又在这是做CS操作,那么假如现在也没有人称,那么搁到这儿我再做一次咨询写进去,那么这个时候干嘛,我们整个就是一个处。OK,操作CS成功,那么处完了以后取法false跳出循环,可是问题是假设我们到这儿啊,我们取到的是一个什么零号开,那么现在零号开怎么着?等不等于那,当然等于那了,那么现在过来进到这。
02:10
走吧,那么先拿到哈希。这个时候我们就要进入到我们这个分支啊,那么现在我们这个数组不等于那正确,并且长度也大于零正确至少是二了嘛,对吧,所以说进来喽,来同学们请看啊。先大体看一下,这个是226行这块大概到248行,我们来说一下这段,那么假设现在呢进来了,那么再用这个H2是我们刚刚新获得的这个哈希编码。N减一二减一得一一跟这个哈西编码做一个未运算,那么又得到了我们的某个坑位,看看假设是零,说明还没有被初始化,太棒了,准备开工,那么现在我们的c busy等于零,那么假设啊,就是这个零号槽外,那么现在我们没有人任何人去动过呢,他还他只是有这个坑外,但是里面还没有值呢,那么等于零,OK,注意请看是不是又是双端检索,因为你看人家那个思想,它是随时有高并发的思想,一般高并发一定要记着。
03:16
进去获得双端检索一下,OK,增加程序的健壮性,那么现在它呢,就R就六了这么一个元素,当然这个就是我们C元素,就是个一,然后再来看看是不是零,假设一切顺利也还是零,没人动过。那么CS busy,好了,我去抢所,我这个先在进来,我要把这个摊位先站起来,我准备往里面写了,那么现在create等于first,然后我干一件什么事呢?那么RS啊,In mg等等等等这些也就告诉你不等于捺,哎,长度大于零,然后呢,也等于这个呢,槽位上呢,也没值呢,然后注意就把你现在经过来的那个弄进来,写进去,OK,那么correct就等于什么。True,那么correct等于出了以后,我们下来finally,那么busy等于零干嘛,我们是不是要释放这个摊位,那比如说啊,现在这块呢,也给我写进来了一个,对不对,那么完活以后这个create因为是处了,那么拜拜。
04:15
处break,跳出我们的循环,那么这个呢,就是我们的是吗?第一个这样的一个一分分之二到这弟兄们没有任何问题吧,好了,那么接下来呢,我们呢,来看看我们的第二号分支照那。这块是个大循环啊,那假设。不好意思啊,现在呢,又来了这块钠是等于那吗?不等于钠。哎哟,那就麻烦了,就不是走这个if了,对吧,那么所以说在这我们不等于那了以后你看它会告诉你CS已经知道可能会失败了,那么在这我们呢,上一波传进来的呢,是一个force force,那么。给你变成错触了以后又进来说明什么?继续after哈希,那么l if完了以后跳出来,那么重新又把我们这个哈希值,那么你看啊,这是一个比较大的一个。
05:09
If,那么l if跳出来,那么跳到这儿了以后,相当于说我们在这儿完了以后最后一行,那么允许你重新来进行竞争和计算啊,这是我们的第二组。第三一个,诶。我们呢,到这儿,他呢也倒不是为难了,那么。现在有零号坑和一号坑对吧,那么刚刚好我就走到这个分支,哎,这块又是a.CS啊,哎,比如说啊,我现在分到了一号坑,又写进去成功了,那么相当于说我就在这,OK,就把我们的值写进去,这是第三个分值,那么写完乘高break,跳出这个循环,OK好了,那么再来接下来啊,我们来看了,如果这儿也是各种是吧。热点呢也比较热,大家都在这么抢着写着,但是并发量又慢慢的又上来了,那么可能要考虑扩容,那这个时候他会怎么干呢?请大家看N。
06:06
如果大于CPU的核数,或者C和我们的这个不是同一个,因为。抱歉,Conflict等于什么first,意思就是说什么你呢也就别扩容了,这个没有任何意义,因为我们最高上限只能是到我们CPU的最高核数也扩了,否则的话大家请看啊,这个一开始是不是false,那么false以后取反是错过到这儿就允许你什么要扩容了,那么来。这一段就是我们的扩容,那么怎么扩的呢?来,同学们请看现在。Busy。等等零那么好。并且sales也呢。抢到了CS搞到这儿,那么C我们这个数组那么注意请看。尿一个数组,现在这个N是几,是不是我们现在的话呢?怎么着我们只有两个坑位啊,二左移一位,那么干嘛,是不是就变成了四啊,相当于说我们现在这个RS啊。
07:09
搞了一个新的坑位,又加了两个,变成四个,完了以后大家请看啊,它这是用负循环,再把原有的这个as挨个挨个的拷到这个RS里面能跟上,那么有点相类似于拷贝啊,那么这个时候sales在指向我们新建的这个号为四的RS,所以说在这儿扩容。为什么是从二到四,就是这来引起的,那么搁到这儿了以后,那么弟兄们就晓得我们的这个就变成了是吗?四个坑位,那么我们这儿啊,就。缩小一点,那么同学们就知道这个意思,它是这个扩容是从哪扩的,来自于哪儿的,好,那么如果扩容成功。值的赋值拷贝也完成,那么finally sales busy值为零,那么前面说过了,那么就是我用完了我就示范,那么这个呢,OK,兄弟,Complete等于不用扩容了,因为刚刚才扩容完嘛,对不对,然后continue,继续,OK,那么来这个呢,就是我们的什么六个分支哦。
08:14
走,走一遍,那么下面我们再来分,再过一遍,最后总结三遍学习,你应该能拿下第一种,同学们请看,就在这,嗯。我们这呢,因为已经K1是新建好这个sa单元格数组了,对吧,然后进来第二个基来这判断当前线程的哈希值运算和运算到的S单元为纳,也是刚才我们所说的说明该cel有坑了,但是这个cel还没有被使用,没有被初始化,所以说。酵素组没有。正在扩或者是正在扩容,那么这个时候的话呢,我们呢。干嘛新建Excel单元,那么尝试给它加锁成功后s busy值为一,说明我抢到了,那么在已经有锁的前提下,大家请看我们是不是双端锁,那么在有锁的前提下,再检测一遍的判断,将CL复制到我们对应的这个数组上面,OK,把它写进去,那么来,所以说上面代码就是判断单前线程后直向的数据元素位置是否为空,为空则将C数组放入数组中。
09:15
发热速组装跳出循环。Break,否,如果不为空,那么continue,继续自学对吧?好,那么这是第一种,第二个呢,我们在这儿。Was uncontened表示初始化以后当前线程是吗?进程失败了。刚才也说过。他进来的时候是false,然后呢,如果取个反,那么这个时候是帧,那么帧就告诉你,那么我要竞争失败了以后,我最底下是不是有这个给你重新来一次机会,重新刷一次我们的哈希槽,因为你万一进来了以后,又跟前面的这些哈希槽获得的槽位不一样了呢,对吧,或者说扩容以后坑位又增加了呢,所以说给你这样重置的机会好,那么这个函数我们这儿也。强调过干嘛重置当前线程的哈希值,允许你重新去参加计算,获得一个新的槽位,OK,因为你假设啊,你在这个坑竞争失败了,允许你重新获得一个,重新再去参与竞争,去其他坑,好,那么下面。
10:15
如果呢,等于false,那么这false取反进来,它呢,重新设置这个值位处,紧接着执行这个,那么重置当前的线程,重新循环,好,这是我们的第二种第三种情况,那么来就是看看我们这儿对应的啊。这个是第二种情况,这是我们的第三种情况,来,兄弟们在这就说明,哎,将加好写进去了,我们相当于说你在坑位上哈,又这么在这儿。斜或者在这一个坑位,这个坑位啊,那么这个零一。二号坑位,那么这个呢,是三号坑位,那搞到这说明当前限制对应的数组已经有数据了,也重置过哈西通过cns,那么干成了,那么干成了以后写进去返回的是错,那么这个时候成功就要跳出这个循环,好这是第三种,第四个那么也就是我们这的啊。
11:02
弟兄们请看,这是我们的第三个,第四个。涉及到扩容的这个。判断,那么假设啊,如果N大于CPU的最大容量,或者跟我们数组这个C数组不是同一个,就不可扩容,False。并通过下面的这个再给你机会重新改变当前线程的哈希值,重新参与竞争,好这是我们第四个,第五个,一个呢,那么如果扩容意下这个是false,那么也就是说现在false取反是错,那么又把它设置为错,重新计算单前的线程哈希值,那么当然啊,也就说明什么,如果到这里以头说明是可以扩容的,OK,当然建上一步啊,如果已经高于这个条件啊,就比如说这两个啊,如果高于这个条件,那么是不能扩容,否则呢,就是能够扩容啊,他们两个嘛,总要取一个,你看这个是false,这个是错,好那么下面。继续第六步,那么就是我们刚才所说的。搁到这儿中学啊,那么。
12:00
在各种判断了以后,我们来发现当前S组和最先复制S是同一个,那么代表没有被其他线程扩容过,那么这个时候说明什么?按位左移移位来操作,扩容大小为之前的两倍二左移移位就是4OK,那么扩容后再将之前速度元素拷贝到挨个挨个的设置进去,相当于说拷贝到新速组当中,那么最后。示范所设置C等于零,设置扩容状态,然后继续循环,OK,那么来大家看这个呢,就是我们的六个分支,那么就是从if到l if l if l if l if,各各各各分别是什么概念?那么总体而言。这种。K1这种K2这种K3,我们的学习顺序是先按再三,最后来说一下这个意见,好,那么接下来兄弟们上面六个步骤的总结。一张图搞定。
13:00
第一种CS更新贝斯乘没乘高,Yes,修改贝斯值啊,退出循环,那说穿了啊,就是我们在外面的这这个情况,最简单的第二种情况,那么来吧,被子值吓坏了,是那那么那为好,现在也就是说单元格数组还没见呢,那么现在是不是要初始化单元格四组?是的,那么加锁并初始化单元格数组,初始化数组等于6S2,那么就是我们前面所强调过的这一步。L if到这儿,那么是不是直接是我们的278行6C等于二听懂就是隔到这儿,那么第三种情况啊,我已经建好了,那么下面呢,如果说更新这个贝斯啊,那么现在我们如果说是。这个成功了,Yes,那么修改base的值啊,那么退出循环,这个也是相当于如果已经有数组了,对吧,我们更新base,你看就是我们刚才我们说的K3,其他线程正在初始化,直接CS尝试二,那么相当于说就是我们这一段这个OK,那么它呢也可以完成,但是如果这些啊。
14:06
都不OK的话,那么第二种情况完了,第三种情况完了,我们要重新计算,那这这两种情况啊,都已经覆盖了,那么假设都不是,所以说我们要取竞争了,那么这种情况,如果这些都要是重新计算线程哈希值啊,那么也记。我们现在都会发现K1是最后的一种情况,已经初始化过了过来,那么当前线程对应的这个cel是不是为空,那么如果为空,那么创建Excel并写进去,那么下面这一堆堆,那么也就是刚才我们所说过的,那么修改竞争这个value,如果是失败的呢?那么不好意思啊,竞争所的状态我设置,如果是yes,就设置这个为错,那么大家请看,也就是我们这儿的。这一段OK,那么挨个挨个六种情况,竖着竖下来,那么来如果是这样情况呢,到1.3根新,我们的C乘高,那么也就是。
15:00
在我们这些新扩的槽位上这么干,那么哪一段呢?也就是我们这儿的这一段,OK,那么对应着我们的多少1.3,那么1.4扩容以后,那么这扩容意向,那么能不能扩,对吧?只要你速度,长度和CPU的这个核数等等设置符合条件,该扩就扩,那么扩容完了以后我们干嘛。当前如果是这个长度小于CPU核数,那么就说明可以扩容,那么最后我们扩容为原来的两倍,OK,那么弟兄们,那么切记在我们的一号线程,这都会有这么一个方法,那么说明什么一号case这啊所有循环分支执行完成以后,都要重新计算单线线哈希值,这个很重要么,最终就是这六个1S,那么给你达成全部的写的这个状态,好,我们同学们,这个就是我们最啰嗦最复杂的我们的什么。Long accumulate,它底层这一大段,尤其是这一堆堆l if,分别是什么意思?好,那么如果说还是懵逼的同学,那么希望你照着老图。
16:03
按照老师的视频和步骤再跟一下,那毕竟啊,那按照我们刚才所说的走分走,我们讲了三遍,剩下的需要你自己消化好,这个就给大家介绍到这儿。
我来说两句