redis口试(十七)MultiLock加锁和释放锁

打印 上一主题 下一主题

主题 1923|帖子 1923|积分 5769

MultiLock

MultiLock,英语直译为多个锁。
redisson分布式锁中的MultiLock这个机制,可以将多个锁归并为一个大锁,对一个大锁举行统一的申请加锁以及释放锁
一次性锁定多个资源,再去处理一些事情,然后事后一次性释放所有的资源对应的锁
  1. RLock lock1 = redisson.getLock("anyLock1");
  2.         RLock lock2 = redisson.getLock("anyLock2");
  3.         RLock lock3 = redisson.getLock("anyLock3");
  4.         RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2, lock3);
  5.         multiLock.lock();
  6.         multiLock.unlock();
复制代码
在项目里利用的时候,许多时候一次性要锁定多个资源,比如说锁掉一个库存,锁掉一个订单,锁掉一个积分,一次性锁掉多个资源,多个资源都不让别人随意修改,然后你再一次性更新多个资源,释放多个锁
MultiLock的源码,我们初步看一下,实在也不过是没什么特别的,就是包裹了多个RedissonLock,底层就是尝试依次对每一个锁都要成功加锁,假如所有的锁都成功加锁了之后,那么就以为MultiLock就成功加锁了
释放锁

依次去释放每一把锁就可以
释放锁的代码一览无余,就是循环释放每一把锁。

加锁

再看一下的源码

这里的locks就是RedissonMultiLock中我们传的几个锁,锁的个数*3,基础等待时间baseWaitTime是4500毫秒。
if和else判定中都是算等待时间的逻辑。
而最下面的while死循环,就是要加锁的逻辑,就是不停地加锁,失败了继承加锁。只要没有全部获取到就一直循环。

RedissonMultiLock.tryLock()方法中
截止到226行,这几个时间分别是
watTime = 4500毫秒
time = 当前时间
remainTime = 4500毫秒
lockWaitTime = 4500毫秒
failedLocksLimit = 0
awaitTime = 4500毫秒
继承走,到for循环里面,取出来locks中的一个锁开始处理
调用了lock.tryLock()方法
这是获取锁的关键代码
lockAcquired = lock.tryLock(awaitTime, newLeaseTime, TimeUnit.MILLISECONDS);
lock是底层的RedissonLock,他没有利用lock.lock(),用的是tryLock(),指定了获取锁等待超时的时间,4500毫秒,必须获取到这个锁,假如获取不到这个锁,就退出,标记为获取锁失败
哪怕是获取到锁之后,这个锁在多长时间内会自动释放,newLeaseTime是-1,因为你的newLeaseTime是-1,所以说假如获取到了锁,会启动一个lock watchdog不断的刷新你的锁key的生存时间为30000毫秒

继承往下,现在环境是拿到锁之后,不会再走蓝色选中的代码了。
最后走到if (remainTime != -1)代码中去,这里的逻辑是怎么回事呢
remainTime = 4500毫秒
经过了一个lock的获取,可能斲丧掉了比如说20毫秒,100毫秒,500毫秒,耗费了500毫秒
remainTime = 4500毫秒 - 500毫秒 = 4000毫秒
time = 当前时间
假如remainTime <= 0,意味着什么呢?获取锁的时间已经超过了4500毫秒了,迄今为止,你获取到这些所的时间,已经超过了预设的4500毫秒了,相称于是你获取多个锁的时间,最多不能超过4500毫秒
假如一旦获取各个锁的时间超过了4500毫秒,此时就会释放掉所有已经获取的锁,然后返回一个false,再次进入while true中的一个死循环,尝试走上述一模一样的流程
获取了三把锁,耗时了1000毫秒,此时remainTime还剩下3500毫秒,4477,4500,23毫秒获取了三把锁

释放锁的话,就是依次调用所有的锁的释放的逻辑,lua脚本,同步等待所有的锁释放完毕,才会返回
而加锁的话,默认的行为之下,你包裹了几把锁,就会锁数量 * 1500毫秒,获取所有的锁必须在多长时间之内就要结束,假如超时就会重新再次死循环尝试获取锁。利用的是各个锁的tryLock()方法,指定了说在获取每个单独的锁的时候,会有一个获取超时退出的时间

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

知者何南

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表