00:00
接下来呢,我们来看一下release分布所的底层原理,什么样子的?那么首先它加锁怎么加的,那么解锁又是怎么解呢?那我们呢,可以把这个方法呢,给它还原一下,那最常用的方法还是使用这个午餐的加锁方法啊。那么解锁方法呢?最常用的也是这个解锁方法。我们点开这个加锁啊,看看它是怎么加锁的啊,来打开这个烙扛法。那么这个lock呀,它其实呢,呃,也是实现了这个Du UC里面的lock接口,跟我们这个lock呢,有点类似,那么人称lock也是实际上lock接口。那么咱们这个I lock呀,它也是一样啊,也是实现那个接口。好,那我们可以去看一下啊,点开这个lock,那这里面呢,咱有多个red对象,那来看哪个呢?我们就看第一个就可以了啊red lock这个对象。那么这个对象啊,也实现了,也继承了啊,还有一个ready best love的对象,那咱可以呢,再去看一下嘛,那anything best love的对象。
01:09
啊,最终实现了这个ILO对象。那么I lock对象啊,又最终继承了lock接口,那这个lock接口呢,就哪个呢?就是guc里面那个lock接口。二的我们可以看一下啊。啊,这个呢,就在那个GUUC里面啊,来这上面就有GUC里面的lock接口。那么一说我们加速的方法。咱们啊来看啊,是这个对象里面的加的方法。它是实现的是guc里面log接口那个加长方法哈。好,那么然后呢,嗯,之前的我们的return lock,它底层呢是基于aqs类实现的,那么现在它是基于release类实现的啊OK,那么实现原理呢,不太一样了。但是呢,具体的逻辑都是差不多的。
02:04
好,那么来看一下啊,它这个lock方法呀,掉了一个lock重载的一个方法,那这个重载方法干什么事情呢。因为它里面呢啊,又去掉了一个吹啊方法。那么只要看过那个人称lock底层代码呀,你就知道了啊,那我们那个人称lock里面,它里面那个lock横法呀,最终也是调这个垂方法,虽然名字是一样的,但是呢,具体实现是不一样的啊。那远程lock里面它调的这个穿亏啊,是AQS给我们提供的穿要亏啊。那么这个地方呢,它也它也定了一个tri,那方法名字差不多。那你看这个方法,你就应该去看一下呀。好,那我们来进去这个tra方法看一看啊,因为它内部又掉了一个tra a single方法。那么这个马又干了什么事情呢?你再点进去。那么点进去之后呢,我们最终它又掉了一个lock inno。
03:05
那翻过什么意思呢?就尝试加锁,尝试内部加锁,让E部加锁的哈。好,那我们来看一下咱这个方法到底又干了什么事情。其他底层啊,就是一个路啊胶呗。你就执行了一个乱脚本eva right think执行脚本。那么这个脚本啊,跟我们自己写那个脚本有什么不一样呢?啊,几乎是一模一样的啊,我们来解读一下。首先呢,通过exist我们去判断啊所是否存在。如果等于零的话,说明这个lock锁就不存在,那应该怎么样呢?我们就直接获取锁就可以了呀。这个h in by就相当于那个h set啊,那么开始直接去获取锁,我们最后呢,也是使用的是h in8来实验的,如果没有任有锁,那就开始去获取锁了。
04:00
那么啊,然后呢,并且呢,去设置一个过期时间,以防止思索,最后呢返了一个URL。如果这个锁被别人占用了怎么办呢?啊,没有被占用,直接就获取锁了,如果被占用了该怎么做?他开始去判断,通过HH类判断是不是自己的锁。那么然后呢,如果是自己的锁,如果等于一说明就是自己的锁,是自己锁的情况下,那么开始对这个log锁的重入次数来递增一嘛。大递增一。那么然后呢,再重置一下获取时间,那返回NR,它是NI呢,代表是获取锁成功了啊,那么这个呢,是获取一个新的锁,那这个地方是在进行重入啊。那么如果啊,这两种条件都不符合,那怎么办呢?他就直接去成了一个啊超时时间,那这个PTPL啊,是一个毫秒级别的这个国际时间啊,以前呢,我们使的是那个TTL获取的是秒级别的国际时间。
05:02
它精确度呢,会更高一点。那我们以前啊,就进行到秒啊。OK,那么这咱们这个底层的辣椒呗,跟我们自己写那个呢,几乎一模一样啊,稍微有点区别。好,那么然后呢,加锁呢,我们就已经看好了,一旦加锁成功之后,我们还要去,呃,设置一个定时任务。来一自动续期呀,它怎么自动续期的呢。好,我们也可以去看一下啊,它怎么自动去齐的。那么这地方呢,执行这个R脚本,它进行加锁,一旦加锁成功的情况下,它就会给我们调用这样的一个方法,叫k expression renew renew吧这么一个方法。那翻过什么意思呢?就是定时过期时间重置。那么定时过节时间重置底层怎么实现的?在上面的就数字化一些参数嘛。啊,然后呢,啊,开始给这些参数设,呃,添加一些,添加一些线程ID对不对啊这样子,那最核心的方法是哪个方法呢?是这个方法了,那rew press。
06:09
啊PI啊这个玩意儿,那翻过来呢,就是重置国际时间嘛。那么从这过期时间,那么来进入这个画看一看。啊,那么他最底层又干什么事情?它最底层呢。啊,有一个什么一个timer task,诶timer task我们应该是印象比较深刻啊。那不就那个定时器的那个定时人物吗。定人器里面那个泰塔斯克呀,啊,跟他长得有点像。那其实呢,确实很像啊。那么大家去看一下这个new timeout干什么事情了?那我们之前呢,是谬了一个,那是timer这里个定时器,然后再一点上的是4K对吧,4k Du。啊,这里个方法可以执行的一个timer task任务啊。
07:00
执行这样的一个定层人物。那么然后这个呃,TR它使用是不是timer定时器呢。好,我们再来看这个new timeout干什么事情了啊?好,我们来进行看一下。那么点进这个方法,那么这个方法呢,啊来看啊,应该是一个弹,那就是一个弹。让new timeout,然后执行一个定时任务,延迟多长时间,时间单位都有啊。那么这个timer是不是我们那个guc里面的timer呢?是不是我们之前玩那个timer呢?那我们可以点进去看一下。什么东西,它是native里面的时间来提供的啊。那么底层呢,是native时间轮,那这个东西咱就不去解读了,因为呢,你要去了解这个东西啊,你还得要了解native才可以啊,那我们呢,没有那么多时间去聊这个东西,因为麦呢也是一个比较复杂的一个东西啊。那么早期版本里面它使用就是guc time,只是后来的话呢,版本升级之后呀,它换成ni里面这个时间,这个时间轮了啊。
08:01
好,那我们了解就可以了,但底层呢,就通过一个定时器来就完成过去时间重置的。好,那么这个定时器咱已经看到了,我们来去啊,再回去看一看,那么在定时器的底层。它怎么重置轨际时间的,肯定是有R脚本来去重置轨际时间的啊,但这有写过那个R脚本。那么在这个里面啊,有有一个人啊,有看有个这样的一个东西啊。啊,只那个脚本的一个一个东西,有一个叫嗯,那renew renew is pressing a think,但以这个think结尾了,就说明了,说明你快找到了啊。那么点进去看一下,你看它里面就是一个罗化脚本。这本里面就去判断,哎,这是不是我们的锁,如果等于一啊A,这个离子如果等于一,说明就是我们的锁,那么进而的话呢,开始执行PP2。啊PK它可以设置毫秒级别的过去时间啊,然来又重置这过去时间了呀。
09:03
那重置成功会返回一个一,那否则呢,会返回一个零,代表重置失败了。那么如果重置成功的情况下,那么它后续呢,还会再去开启一个重置国际时间。那么如果统治已经失败了,他会再还会再执行这个东西吗?就不会在去执行了啊。OK,它底层啊,大量的使用这个canable future这这类东西啊,那么这个呢,也是GUUC给它提供的一个东西啊,那么叫呢,叫莱德包。看play ball,然后是future,这里一个这里一个异步,异步工具类啊,那有兴有兴趣的同学呢,可以去了解一下。那么只要上过我们上一股课程的啊同学啊,应该都知道这样的一个类啊,那咱们在电商项目里面就使用过这样的一个工具类。好,那这样的话呢,咱们也就不过啊,不做过多介绍了啊,那这个东西因为呢,光介绍他的话呢,也需要很长时间。
10:02
好,那么你们可以呢,自行去了解一下。那么这个枷锁我们已经看到了,加锁以及重置过期时间咱们已经看到了,那么解锁怎么解锁呢?好,我们也可以去看一下。那么打开这个unlock这个方法,那么unlock方法呀,那么答案依然是通过这个试体类进去啊,有个解锁方法,那么然有一个unlock of think方法,那么点进去。点影之后呢,它解锁的时候呀。It is unlock inno。那么再进去,那么就应该有解锁的那个R脚本啊,但是我们这里好像进的是一个抽象类,那咱可以进入那个具体实现类里面去啊来点进去。那么应该就是这个东西。那进去之后呀,我们又看到一个路R脚本,那这个R脚本呢,是在进行解锁。那么首先来去判断啊,是不是我的锁,如果等于0H如等于零,说明不是我的锁,那不是我的锁,我能去解锁吗?不能,那直接返回一个压L就可以了,那么然后就结束了。
11:03
那么如果是我的所能,就走到下面来了。那么来一个呢,来一个local定义一个局部变量,那咱今天又讲过这个讲多角本的时候呀,讲过这个局部变量啊,讲这个局变量目的呢,就在这个地方可以用到。啊,看这个源码呢,就比较容易理解一点。第一个就变量叫count。那么这个countt等于点Co h by负一,就进行减一嘛。他看的值呀,就是呃,减一之后那个值啊。如果减一之后大于零,那说明没有减到零的,没有减到零的,减完之后就可以了呀。那么于是呢,它就返回一个零,但在返回之前啊,他做了一个过期时间重置啊。啊,重置了一下过期时间,那我们之前呢,没有做这个事情,那他这里呢,做了一下解锁呢,也会重置一下过期时间啊。那么AA的话代表已经小于等于零了,如果大于零说明没有减到零,没有减到零的情况下,那么减完就可以了呀,那么它只要重置一下过去时间就可以了,返回一个零。
12:07
那么I。上面已经小于等于零了。那么小于等于零的情况下,咱就可以把这个锁呢,给D给删掉了,给释放掉,那这里呢,又多了一个发布订阅的一个东西啊,咱这就不管它了。然后呢,呃,解锁完之后呀,就解成一个一代表呢,解锁成功。那么如果是其他情况,就放一个NRL。那时呢,如果你要失控的所不属于你,它就返回一个NL,如果减一了。简,简易的,没有简为理由。它就返一个零啊。如果释放所成功,因为减已经减为零了,释放所成功了,就返回一个一。那就出来了一次返回零释放所成功的返回一,如果你要释放的时候不属于你,就会返回一个,那这样的啊。好是咱们这个分布所底层原理,那跟我们自己写那个呢,几乎是差不多的啊。
13:03
那么释放所成功之后呀,它这里呢,还有一个啊,取消那个定时清的一个方法啊,要有一个to expression re吧,就取消过期时间通知嘛。啊,那这个方法呢,咱也就不看了啊。那底层原理,它大量使用这个坦非来做了异编排,所以它的性能呢,比我们自己写的那个分布式索呀性能要好一些。很多东西呢,都使用一不了。好,那我们这个底层原理啊,我们就看到这里啊。
我来说两句