做图片赚钱的网站,2021年重大新闻事件,无锡装饰网站建设排名,爱采购网MultiLock
MultiLock#xff0c;英语直译为多个锁。
redisson分布式锁中的MultiLock这个机制#xff0c;可以将多个锁合并为一个大锁#xff0c;对一个大锁进行统一的申请加锁以及释放锁
一次性锁定多个资源#xff0c;再去处理一些事情#xff0c;然后事后一次性释放所…MultiLock
MultiLock英语直译为多个锁。
redisson分布式锁中的MultiLock这个机制可以将多个锁合并为一个大锁对一个大锁进行统一的申请加锁以及释放锁
一次性锁定多个资源再去处理一些事情然后事后一次性释放所有的资源对应的锁
RLock lock1 redisson.getLock(anyLock1);RLock lock2 redisson.getLock(anyLock2);RLock lock3 redisson.getLock(anyLock3);RedissonMultiLock multiLock new RedissonMultiLock(lock1, lock2, lock3);multiLock.lock();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毫秒4477450023毫秒获取了三把锁 释放锁的话就是依次调用所有的锁的释放的逻辑lua脚本同步等待所有的锁释放完毕才会返回
而加锁的话默认的行为之下你包裹了几把锁就会锁数量 * 1500毫秒获取所有的锁必须在多长时间之内就要结束如果超时就会重新再次死循环尝试获取锁。使用的是各个锁的tryLock()方法指定了说在获取每个单独的锁的时候会有一个获取超时退出的时间