00:00
刚才呢,我们基于鲁已经实现了一个简单的分数入错。那我们是利用了z no的节点不可重复这样的一个特征来实现的,那么在实现的过程中呢,我们不停的去自选来火炬素。那咱家也可以认为呢,这是一个自选锁。那我们来去看一下咱们这个代码,那么首先的话呢,咱大量请求都来获取锁,那么只有几个请求可以成功呢?啊,那么只有一个请求可以创建节点成功,并且获取到锁来执行业务操作。那么其他些请求啊,那么咱们可以咱们会进行自学啊,来进行重试递归重试进行自旋嘛,就相当于进行自旋哈。那自选它就会浪费我们的这样的一些CPU资源,影响我们的性能。啊,特别是在高并发情况下啊,影响呢就比较明显了。那所以呢,咱前面单元测试的时候呀,有的同学呢,应该观察到这样的一个现象,什么现象呢?就是一开始呀,我们并发量吞吐量啊,A是稳步提升的,有200多可以提升到300多的,提升到400多,然后紧接着。
01:12
然后后续请求累积的越来越多了,并发量越来越高了,然后呢,我们的性能呢,受到影响了,然后就开始就下降了啊,最终呢啊回到不到400的这样的一个并发量占吞吐量。那就是因为自选导致的,它影响我们的性能了啊。那怎么办呢?哎,那么自旋对应的就是上就阻塞锁了,哎,那如果我们能够实现阻塞锁的话,那咱就可以解决因为自旋带来的性能消耗,那既然的话呢,可以在一定程度上提高我们的组K锁的性能。那么咱怎么去实现这个组厕所呢?在组K里面啊,咱们可以利用临时序列化。序列化节点,那么来去实现咱的主搜索。那我们呢,可以在命令行扣单工具里面,咱去演示一下啊,看一下什么样的思路来实现这个阻塞算啊。
02:08
那我们,嗯,比如说假设我有五个请求都都来都要来获取这个锁了哈,那这五个请求咱最终肯定都要创建节点成功,对不对啊啊多要创建节点成功的会一到所。那我们就可以这样子,既然你都能创建节点成功,就让你创建创建成功呗,那怎么样才能创建成功的,才可以创建序列化节点,因为序列化节点啊,哎,它呃,同一个节点可以重减多个,只是后面呢,它给他追加了一个序列号这样一个东西。之间的一个序列号,这个东西好,我们来去看一下啊,比如说呢,有五个请求过来了,那就可以创建五个序列化节点,那么一个per杠,一是临时节点杠,S呢是序列化节点,我可以在这个locks这个下面。创建一个lock节点,那我现在呢,可以开始加个杠,要加个杠,那这样看起来呢,更加方便一点啊好,那我一会说,因为这个节点呢,已经呈现出来了。
03:02
此时创建出来的呀,是呃四三这个节点,那么我们还有另外四个请求,它也可以创建出对应的这个节点,哎,五个节点呢,对应五个请求都创建好了。那么是不是这五个请求都获取所成功了呢?那肯定不行,如果五个请求都获取所成功的话,那就存在并发了呀。啊,那咱让每个节点回到所呢,我们可以让最小的那个节点回到数。那我创建节点成功之后,那我怎么知道我自己是最小的一个呢?啊,咱们呢,肯定要进行比较啊,进行比较。然后呢,我看看咱自己是不是最小的。哎,如果自己不是最小的,那应该怎么样呢?那你应该等待着。那等待着,等最小那个获取到锁,让执行完业务逻辑释放锁了,那你再去获取锁。那如果仅仅是这种思路的话。啊,依然会存在一个一个风险,比如说呢,这个四三这个节点呢,它会到所成功了啊,会所成功,然后执行业务操作,执行完业务操作之后呢,我们通过这个delete指令把这个节点呢给它删掉了。
04:10
筛项之后呢?接下来哪个节点会多少呢?哎,我们可能要去自选了。对吧,咱们这个四十四四十五四六四七,他们肯定要不停的自选来时刻呢,去看一下我是不是最小那个。那又回到自选的那个老子上去了啊,那肯定是不合适的。那怎么办呢?我们可以这样子,我们可以呢,只让他判断一次。比如说呢,我创建好这个节点的时候呀,我就判断自己是不是最小的,比如43这个节点,它创建起来的时候,哎,他就发现自己最小的,那你就可以立马回到少了。那么44创建出来的时候呀,哎,当它一一它发现的话呢,我们就可以判断是不是最小的,要发现不是最小的,那怎么办呢。我可以让他去监听啊,比它小的那个节点,比它小一个的那个节点啊。
05:00
然后呢,呃,我们45也是一样,发现自己不是最小的,我跟你说,你监听44这个节点。啊,然后呢,46啊,减成45这个节点。啊,那么四七呢,监听四六这个节点。那么这样做好之后的话呢,四三先回到四,因为它就是最小的嘛。然后呢,呃,执行完业务操作之后呀,释放锁。一旦我释放锁,然后呢,咱们44就可以接听到这样的一个时间,那么进而它就可以获取锁了。那么45 4647他们怎么办呢?他们只能在这里一直监听着。那么知道它上一个节点获一到锁,并且释放锁成功的情况下,那么咱们呃,下面那个节点的话呢,才可以获一到锁。那么如果啊,你这个你这个没有没有没有处罚钉钉事件,他一直等待着,一直阻塞着。他什么都不用干,他就一直监听着就可以了。啊,这样呢,就可以达到一个呃阻塞的效果。当也有同学发现,哎,这类似样类似于公平锁对吧,啊公平锁,哎,那么确实咱这里呢,是一种公平锁的一种思路。
06:07
啊,谁先来,谁先创建一个小节点。然后呢,谁就可以先获取到锁啊这样子的,哎,无意间呢,我们就可以实现一个公平锁了啊。OK,那我们,呃,咱这的话呢,主要是目的呢,是实现阻色色啊,但顺带的话呢,咱实现了一个公平锁这种现象。好,那我们来去看一下啊,咱刚才命令行呢,简单的分析了一下。呃,可以这样去实现,那具体代码又该如何去写呢?好,那我们这里的代码呀,大家要改造一下了。那每一个请求进来,我们就可以创建一个临时序列化节点。咱再追加一个啊Qu创建一个序列化节点,临时序找节点。那我这个节点,哎,是什么节点呢?咱最终这个方法呀,其实可以返回当前这个节点的啊,节点全路径。
07:00
你比如在命令行工具里面,当我创建一个基点成功的情况下,那正常会给我们返回一个这个基本全路径。返回这个节点全路径,好,那我就可以拿到这个节点的全路径了。好,那么这的话呢,咱们就,嗯,拿到这个current。Current,嗯,是not pass这样的一个玩意儿,当前节点的路径我们就可以拿到了。你看当天这个节点是不是最小的那个。好,那我们其实呀,呃可以去判断一下啊,或者说呢,我们可以这样子,我们可以写一个呃方法,我们将来可以写一个方法啊,那么这个方法可以干嘛呢?可以获取它的前一个节点get brave node的那个方法。啊,那么如果你这个前前节点啊。呃,为空那生产说明你就是最小的一个节点,那就可以获取所成功,那否则的话呢,我们就一直要要监听着啊OK,那咱可以呢,获取那么前置前置啊节点。
08:11
啊,如果前置节点为空,那么则获取所。所成功啊成功,那么否则那么监听啊前置节点就可以了,我当前节点呢,可以监听前置节点。好,那么这个地方呢,咱就要去,呃,最终你肯定返了一个前置节点嘛。那么来一个啊普是noda啊noda啊,这里一个玩意反映这个东西。好,那我们现在呢,就要去实践咱们这个方法了。那么,如果这个前置节点不为空,我们还要添加监听时间。还有天天监听事件,那咱这样的话呢,来看。
我来说两句