00:00
刚才呢,我们已经看到release的底层原理。那它的分母索底层原理啊,跟我们自己写的分母索呢,几乎一模一样。那唯一的不同点是什么呢?不同点就是它多了一个啊,Can future这么一个玩意儿。那么有的同学呢,出去面试的时候。让面试官问他,你怎么实现分布式所得呀,有同学说呢,我手我手动实现的,他自己实现的,那于是呢,啊一五一十的跟面试关系聊一聊的,你可以从特征这个维度来去聊一聊。你也可以呢,从所操作这个维度来去聊一聊,这都是可以的。那么又有同学说呢,我使的是reason框架啊,来以实现的,那于是面试完就问了,那底层原理是什么呀?OK,那么其实很简单嘛,我们都带你手动实现了,不对啊,那你还不知道底层原理是什么东西吗?那肯定知道啊,不是跟我们差不多吗?那么只是呢,你说起来呢,更加方便了,因为你只要说好呢,只要说第三个第四个实验就可以了。那前两个实现的你就不用去说了啊,它底层原理呢,是通过哈希数据模型加R脚本,那么再结合comfortable future这个异步技术,那么来实现的。
01:11
那么解锁的话呢,也跟我们差不多嘛,对啊,他取消了一个顶式人物。取消了一个自动续期啊,多了一个啊,多了一个东西啊。OK。那所以的话呢,不管说你是手动实现的,还是使用来实现的,那么实现原理呢,都差不多的啊,就回答这些东西就可以了。好,那么咱这个可重入锁看完之后呢,官方啊,除了可重入锁之外,那么其他提供了其他的一些锁啊。好,那我们可以去看一下,那么找到咱们这个分布式锁与同步器这一章,那么这一张啊,咱已经玩了一个可程木锁了。你看他通过这个red填get lock这个啊,就是那个ready clean啊。那么get lock获取一个锁,获取一个lock锁,那么lock.lock就可以加锁,用最常见的四种方法就是lock.lock。
02:04
那么然后呢,解锁方法呀,就是log.lo。它也可以呢,去指定一个过期时间,那么超过这么长时间还没有解锁,它会自动解锁啊,啊,你可以呢,不用去手动解锁,它也可以自动解锁啊。那么你也可以使用参log用法,那么指定啊几个参数,那这几个参数什么意思呢。那比如说呢,咱在这个案例里面,它就是呢,等待100秒的就会一锁,如果100秒依然没有回到锁,他就不等了,就快速失败。然后获一道锁之后呢,它会加锁十秒钟啊,如果十秒钟依然没有释放锁,它会自动解锁,那这是过去时间的一个单位啊,这时间的一个单位。它是它的一些常用方法啊。它最常用的还是lock方法以及unlock方法啊,那么这两个方法呢,咱可以了解一下,那就可以了。那么然后呢?呃,咱们来看这个文字描述吧,他说呢,基于red的red分布式可重入锁I lock这个对象,这个加va对象,那么也实现了GUUC里面的lock接口。
03:09
那么同时还提供了这种异步的这个这个接口啊啊,咱不用管它了。那么然后呢,啊,他又有在描述,他说大家都知道,如果负责存储这个分步骤所的节点宕机以后。而且呢,这个锁呢正好处于锁住状态时,这个锁呢会出现锁锁状态。它是什么意思呢?Raing啊,它其实是一个客户端哈,对吧,是一个客户端,那比如说我们10010这个应用程序,还有10086这个应用程序,都通过这个客户端,那么来去到release中来去获取所得啊,来到获取所得。那么然后这个客户端。节点宕机,那anything节点是什么东西呢?就这两个客户端程序啊。如果这两个客户端程序宕机以后,这个锁呢,正好处于锁住状态,哎,那么咱这个客户端程序还有机会去unlock解锁吗?就没有机会解锁了。
04:03
那怎么办呢?那么它就会出现锁锁锁锁呀,那我们就可以给锁能力制定过期时间。就说为了避免这种情况发生,内部提供了一个监控所的看狗。它的作用呢,是在Les使例被关闭前不断的延长所得预效期,那这句话呢,其实说的有点毛病啊。为了防止死锁,我们可以呢,给锁添加一个过期过期时间就可以了。那么这个,呃,开门狗啊,其实就是一个开定时器啊,它起的名字非常好听,叫监控所的开门狗。那其实就是个定时器啊,那这个定时器呢,定时延长所得有效期是为了避免。过期时间不够,来延来延长所一个题啊。啊,为了避免锁的时间不够,被延长有效期的。啊,所以呢,它其实呀,呃,跟这个死锁呢关系不是很大。那这个过期时间才是防止死锁的啊,啊这个延长有效期的话呢,它只是自动续期,这是这的这句话的描述啊,不是很很准确。
05:06
那默认情况下看狗的检查所的超时的是30秒,那么你也可以通过一个配置类,那么来去改这个超时间,因有个抗个对象嘛,咱前面也讲过这个抗一个对象啊,你通过这样的一个东西就可以指定咱的锁的过去时间了。好,你给它默认是30秒,他跟我们是一样的哈。那么到底能不能给我无限的去延长所的有效期呢?那我们呢,也可以去演示一下,大家可以找到我们这个,呃,库存的这样的一个代码啊。那我们在这个地方呢,可以去,嗯,来一个time time,嗯,然后是unit点上啊,second.sleep比如说就碎一个啊1000秒,那么这个呢,咱可以来一个嗯,Try catch嘛。这个开啊处理一下,那么然后呢,我们来又重启这两个服务啊,来重新启动。
06:02
那么现在呢,他这个,呃,业务逻辑啊,它需要1000秒才能完成。那我们这个锁的过期时间呢,它默认是30秒,那这个时间肯定会不够,那不够怎么办?它会它会一直延长一直延长哈。好,我们来看一下。它已经都启动成功了,那我们来去访问一下来刷新。好,我们来看一下这个race里面这个自动续期啊,哎,就这个锁,你还有24秒,23秒22秒。那么然后呢,21秒,20秒啊,然后再一看,又回到这个28秒了。那市面上的,市面上会一直去延长我们这个。有效期啊,只要你的应用程序没有结束,它会一直延长一直延长又通知了。好,是咱们这个过去时间同志,那它的实现呢,也跟我们差不多的啊,OK,它给它起了一个非常好听的名字,叫监控所的看门狗,其实就是一个定时器啊OK,接下来呢,我们再来去测试一下这个可重录锁,那我们可以把这个太子方法呀,直接拷贝过来,让它放在我们这个地方,然后把这个T呢改成二。
07:10
那么把这呢给它改一下,改成啊Z4点。点上getlock。那么然后这个地方呢,我们应该是嗯,Log锁的名字要一致啊,如果你不一样的话,那就是另外一个锁了,那肯定呢就无法重入了啊。他说的名字比较一样,要跟他啊,要一模一样。好,那么然后呢,在这个地方啊,咱可以通过这个lock点上lock来加锁。那么然后这个地方呢,咱应该是lo.unlock那么力解锁。好,那我们呃,写完之后呢,再去回到咱们这个减库存方法里面去,那我们可以去调一下。那个子索方法,我来一个Z点派索方法就可以了。那么接好之后呢,我们可以打几个断点,那么这个位置打个断点,在这个位置打个断点,哎,这个位置啊,或者说这个位置啊,然后呢,这个位置。
08:09
以及呢,这个位置好,那么电影搭好之后呢,我们来去重新启动咱这两台服务器。那之后呢,我们打开浏览器来去刷新一下。啊,那我们来看一下已经到达断点,那么此时呢,我们应该是加锁了一次啊好,那么在red里面应该有这个重复次数是一,那么过题时间呢,还有啊十几毫秒啊啊十几秒。那么赶紧呢去走一下,走到这个下一个断点开始走内部的一加锁,那又获取了一次锁,那么此时呢,我们的过期时间应该是重置了,那呢,次数呢也已经变成二了啊。那么然后紧接着我们开始进行解锁,那么然后解了一次锁之后呢,啊,走到这个这个位置,那解了一次锁,第二次呢,还没有解锁来哈,只是执行了这行代码,还没执行完,那么解锁完之后呀,应该变成了一个一。
09:11
然后呢,我们的过去时间啊,还有22毫秒,22秒好,那我们呢,再来解锁一下,直接呢F9可以解锁。那么检测成功之后呀,我们来去看一下这个red里面这个值哈,它就已经没有了。啊,就没了。好,那么这可同用水啊,他也已经帮你去实现了。
我来说两句