前言Redisson基于RedisRedisson分布式互锁RedissonMultiLock对象可以将多个RLock对象关联成一个互锁,每个RLock对象实例可以来自不同的Redisson实例。当然,这是官网上的介绍。它是什么?一起来看看互锁MultiLock的使用和源码吧!1MultiLock的使用根据官方文档,这里的Redisson客户端可能不太一样。当然,并不是说一般的工作不需要client。2锁在阅读MultiLock锁之前,你应该已经阅读了关于普通锁的相关文章。源码入口:org.redisson.RedissonMultiLock#lock()defaulttimeoutleaseTime没有设置,所以是-1。这个方法太长了,我们分开看吧。基础等待时间baseWaitTime=锁数*1500,这里是4500毫秒;leaseTime==-1所以waitTime=baseWaitTime,也就是4500;while(true)调用tryLock锁定直到成功。调用tryLock方法,参数waitTime=4500,leaseTime=-1,unit=MILLISECONDS。我们来看看tryLock中的逻辑?LeaseTime!=-1不满足,直接跳过这部分。waitTime!=-1条件满足,remainTime=4500,lockWaitTime=4500。因此,failedLocksLimit()方法直接返回0,也就是说所有的锁都必须成功加锁。这里是重点:遍历所有的锁,依次加锁。锁定逻辑与可重入锁定没有什么不同。所以Lua脚本就不分析了。以上是tryLock加锁后的结果。如果加锁成功,将成功的锁放入acquiredLocks集合;如果锁失败,需要判断failedLocksLimit,因为是0,所以会直接释放成功锁集合acquiredLocks中的所有锁,同时清除成功集合。恢复迭代器。每添加一把锁后,会更新锁的剩余时间。如果remainTime小于等于0,说明锁超时,直接返回false。这将执行外部while(true)逻辑,然后再次通过RedissonMultiLock#tryLock。3LockRelease看完加锁逻辑,更容易理解加锁释放。直接遍历释放锁即可,lock.unlockAsync()就是调用的RedissonBaseLock#unlockAsync()方法。4小结根据我的理解,画图如下:一般来说,key1,key2,key3...keyN放入一个List集合中,然后迭代加锁,直到全部成功。解锁时,遍历锁释放锁。本文转载自微信公众号“程序员小航”,可通过以下二维码关注。转载本文请联系程序员小航公众号。
