00:00
好,我们来给分析一下,如果我们要实现可重入锁,那么加速啊,该怎么加速。那么首先呢,我们来看,首先咱们要去判断,哎,是不是有人有锁了啊,按照速度分析第一步。我们可以参照咱之前的log。那么首先咱们要判断有没有人占有,没有人占用锁。那怎么判断有没有占用所呢?咱们只要去判断这个lock锁是否存在就可以了。那比如说呢,我可以通过这个exist这个指令来判断这个log所是否存在。如果反应一直是零,说明什么呢?说明log所就不存在。那如果那锁不存在,那我们就可以通过这个h set指令。那么来去获取锁啊,来一个拉锁,那UID呢,我可以随便写一个UID,然后设置为一,我第一次加锁可以设置为一嘛。好,那么这样呢,我们就相当于加锁成功了,那么在我们的这个release里面,我们就应该有一个锁了。
01:10
好,那么然后呢,回到这里来哈,那么第一步我们应该判断。对吧?锁是否存在?哎,那么如果没有现成占用锁,如果锁都不存在,那就说明没有人没有现成占用锁呀。那么子咱就直接获取所就可以了。那么判断所是否存在,我们可以通过这个this这个指令啊,可以判断。那么然后呢,则直接获取锁,直接获取锁怎么获取呢?我们可以通过set指令。然后是key field。Field的,然后呢是value啊,通过这个指令去获取所。好,那么然后呢,第二步啊,如果这个SP值不为零,咱之前如果在值不为零,说明所已经存在了。
02:06
已经被占用。那已经被占用的情况下,我们就要判断是不是当前线程。占索雷啊,占用索雷啊,如果是单线线程的话,咱可以进行重录呀。那比如说我这个锁已经存在了,那么是不是当天限行占用的锁呢?咱可以通过H。AZ4这个指令,那来判断。那么来一个lock,然后就随便写个UID随便写一个啊,诶,此时。我这个当前线程的UID是这个。有所线程的UID呢?是这个两个一样吗?不一样。那不一样的情况下。它反应就是零,如果这个所存在了,如果这个所存在了。但是呢,这个锁呢,不是我的锁一,我们发现的不是自己的锁。
03:01
那咱就不能重入,那如果发现4G的总的比如说呢,哎,我这个嗯,单径线程啊,就是这个有所线程哈,把这个UID呢,给它放在这个位置。哎,发现呢是等于一,那是面的,说明我等线程就是这个有所线程。咱就就可以进行重组了呀。啊,如果所存在,那么这怎么样?则重入就啊则判断,判断是否自己的所。如果是自己的火,那么走重路。好,那么这个怎么判断是否自己的锁呢?我们可以通过这个HXZ这个指令。如果是谁的数,则重入,那重入呢,咱怎么重入呢。每重录一次,我要递增一。好,咱可以使用的,使用h in Korea Korea by这个指令,好来一个lock,好把我们这个UID啊给它放到。
04:08
咱们这个里面去这样来一个一递增量是一啊啊递增量我们一会说也已经变为二了。那么此时我们这个lock所这个U这个值呀,已经变成二了啊,那每重入一次,它会加一,咱可以使用H1,一根八为递增一。那此时呢,应该变成三了,来看一下已经变成三了。好,那么我们这个位置如果所存在,则通过ad子可以判断是否自己的锁,如果是自己的锁,则重入重个指令,咱可以使用in Korea。然后呢,Key field。然后是Korea递增量了。等一就可以了。好,那么第三步啊,否则如果所存在,然后又不是自己的锁的啊,如果所存在,然后又不是自己的锁的情况下。
05:08
那之前呢,在人称lock里面。这样加入到等待队列里面去。那我们这的话呢,就不能实现这种等待队列这种阻塞走了哈,我们能实现实现什么呢?实现重试,让它进行重试就可以了啊,就进行重试。嗯,否则咱就重试嘛,那重试的话,咱可以使用它呢,使用这个递归啊,或者呢循环来重试。那咱在代码里面重置就可以了,不需要什么指令啊。好,这是枷锁。那么加速的卢瓦脚本,那我们可以先写出来啊,哎,怎么写这个卢瓦脚本。我们可以呢,通过这个if判断来一个ready点上空来执行。AZ是这个指令对吧,啊平AZ是指令。
06:02
大森可以把这个这个。Exist这个指令,然后呢,再来一个lock,看这个lock所是否存在,如果等于零,来看一下,如果等于零说明不存在,那不存在我就可以直接通过h set,我就火就锁了啊,如果等于零,那么存在。来一个ready点上扣,咱可以执行h set指令,好,那参数顺序呢,跟指定顺序是一样的啊,那么指定顺序呢,是h set。然后锁的名称UID,然后设置为一。那我们应该是,嗯,把这个lock锁作为T,让UAB作为内存的T,还有它这个这第一次加锁,把这个值呢写为一就可以了。好,那么然后这是获取锁成功之后啊,我们还没完呢,还要给锁呢添加过期时间。
07:07
为了防止死锁,咱给锁添加关机时间,这以点上扣我们再加一个。XT这个指令给我们的,嗯,Lock锁添加一个过期时间,比如咱可以添加一个30秒的。过期时间啊。那么这个锁呢,比如说单已经设置成功了,此时我的锁呢,是没有过期时间的啊,应该是负一代表是没有的。那我们可以通过。啊,XP这个指令给我们这个lock锁,比如设置30秒的过去时间。那么30秒的过去时间,那么等于设置成功了呀。那么咱30秒之后呢,锁会自动释放掉啊。OK,那么在乱加班里面加锁成功之后,咱们要立马给锁设置过期时间,然后呢,RETURN1是加锁成功啊。
08:02
返回一个一返回一的话,在加法里面不就返回,这是出吗。那不管是呃加锁成功还是重复成功。那么在咱们这里面都反馈说啊。在这个底层源码里面呢,之前看过啊。那么就返一嘛。那么然后呢是I,我还可以使用I衣。然后是点上。口,如果锁存在了,那我就要判断是不是自己的锁。那怎么判断是不是有所呀,再通过H也等于四。如果这个锁呢,已经存在了,咱可以通过判断是不是自己的锁。那么这个地方呢,我们就可以使用HX这个指令,然后呢,把这个lock锁给它放进去,那UID呢,咱将来也要给它放进去,如果等于一哎说明就是自己的锁,那么是自己锁的情况下,那应该是ready点上。
09:04
Q,我们要经常执行那个H18这个指令,AB等于。好,这是in Korea。啊,来一个呃,Lock,给咱这个lock锁。然后这个UID,然后呢,递增一就可以了,递增量是一嘛。那么重构成功的情况下。那我们还应该怎么样呢?还应该重置过期时间。因为啊,我们给A方法加锁的时候啊,咱可能从来没有想过,A方法可能会掉一个B方法,这个B方法也需要锁,对吧?啊也需要锁。那咱只预想到A本身可能需要30秒的时间。那么我也可能预想到B本身可能需要30秒的时间,但是我没有想到呢,啊,A里面又调了一个B了。又点了一个B。那么可能咱只预算到A本身所需要的时间,到B方法里面所剩时间可能已经不多了,那B呢,本身可能就需要30秒,结果呢。
10:03
嗯,可能嗯,已经被A消耗的差不多了。如果此时不重置过滤时间的话,可能B刚刚拿到,刚刚重复进去。啊,锁时间到了,现在最好呢,重置一下过去时间啊,此时啊,咱可以呢,再去执行这行代码给它放在。那么这个地方。然后呢,是啊一呀,那我重入成功也是加速成功了呀。那么else,如果以上条件都不满足,则获取锁失败,咱可以来一个return return0,那最后呢,是。那么如果是一的情况下,在Java里面就有除。哎,咱这样的话呢,就说明获取锁或者重铸成功了啊,如果反应值是零,说明获取锁或者重铸失败了,或者获取锁失败了,咱们要进行重试。啊,这个地方就根据这个反应值来去判断。好,那么咱这个芦辣胶饼呢,就已经写好了。
11:01
那么写好之后呢,那你会发现我们这几行代码和这几行代码有点像。你看就唯一的区别就是这个地方不一样,就这个地方不一样。那我能不能合并一下呢?哎,可以啊,那比如说呢,我现在这个lock锁已经不存在了。没有的情况下,Loss已经不存在的情况下,那我不使用h set,我直接H8可不可以呢?看来一个啊拉锁,那随便写了一个ID,这个锁不存在的情况下,就直接来个T等于一行不行。哎,我有回车来看。啊,但我好像写错了对吧?啊是八写错了。啊,来一个B啊这个地方来,我一回车也设置成功了。那么此时来看一下我们这个客户端啊,来刷一下也还是可以的,那说明啥呢?说明我们可以使用h in by可以替换掉这个h set。
12:01
切换掉那圈掉之后呢,这三行代码和这三行代码就一模一样了。那么于是呀,我们就可以把这一代码呀。要给它删掉。给它删掉,然后这两个条件呢,咱可以合并一下啊,我们可以这样子,如果锁不存在,我使用它们来去获取锁。好,那么如果所呃存在,是我的所,应该是一个奥的关系啊。哎,那我们也可以呢,是使用这几行代码的重入,并且重置国际时间,让它反映知识一。这样就行了啊。好路R教本写好之后呢,我们去分析一下,哎,我们会有几个K参数,会有几个二参数啊,那么K参数呢,咱可以把。这个log所锁的名称给它放到这个呃,K里面去,那么二列表里面呢,那这样的话呢,我的这些位置呀,都可以用这个K,然后呢,下标一来进行替换掉了。
13:03
啊,那么所有loft的地方都可以使用case,下边一给替换掉,那么这个位置呢,也是一样啊,给个替换掉。好,那么还有呢,是这个UID,那么UID呢,我可以给它放在这个R里面去,那么这样呢,我这个位置呀,就是应该是R个位,那下标是一了。那么然后呢,来这个地方我也可以使用。那阿格下边一可替换掉,那这过期时间。过节时间也可能动态变化呀。啊,因为呢,不同的地方,我的过期时间可能不一样的。那所以过期时间我们应该也是动态传递进去了。那么这个30呢,也应该动态传递进去。那像这个log锁不同的地方,咱log锁的名称可能也不一样啊,那么UID呢,是不同的请求就不一样,所以肯定都是动态的,那过期时间呢,也可能是不一样的,所以也要动态重新进去,那我可以呢来一个啊阿哥V。
14:01
然后是二。然后来去设置进去。好,那么这个胶面呢,基本上就已经啊成型了啊,就这样子。那么咱写好这个落脚本之后,我们要去测一下。那看看好不好用,咱给它放到一行上面去啊,给它重新啊编辑一下,放到一行上面去。呃,这些呢,全部处理一下。啊,然后把整个辣脚本拷贝过来。让它放在我们的里面啊,来试一下,我们来一个一把指令。好,这个脚本呢,咱刚才已经写好了,把它给拷贝进去。那么拷贝好之后呢,我们来看,咱一共是需要三个参数一个K啊。一共是需要一个K,这应该是一个K,那咱就叫lock,那么UID呢,可以随便写个UID,然后呢,30秒的过去时间,那我现在有没有爽,有没有那个爽的。
15:03
Lock锁是存在的啊,因为这有个lock锁是存在的,没有过去时间啊。拉个锁已经存在了,我这执行这个罗脚本怎么样?反应值是零,说明霍基索失败了。好,那我可以把咱之前这个log锁呀,给它删掉,把它删掉。那么直接拉手呢,已经没有了啊。那没有了之后,我们再来去执行这个货机锁氯化脚本,那我一回车,你已经加速成功了,反应值是一,此时我们的锁呢,它就已经有了。然后呢,获取锁了一次啊,那此时过期时间,那么还有多长时间呢?还有不到20秒的过期时间,那我再去获取一次锁。相同的线程火计算啊,那为回车应该重铸了,应该变成二了,那过机时间已经重置了啊,已经重置了。那我们啊,这的话呢,再一等等等电是二,然后过去时间应该不到20秒了哈,我们再来去获取一次,那此时呢,应该重置了三次了,过期时间又重置了啊。
16:02
好,那么这咱们这个可同工所能就省电了呀。那如果这个UID,哎和这个UID不一样呢,还能重入吗?回回车你反应值是零。所存在,但是不是你的锁啊,那么你也不能重入。你马上一会儿就过期了。啊,自动过期。啊,是咱们这个加锁落脚位,我们就已经写好了。
我来说两句