前言
基于 Redis 的 Redisson 分布式联锁 RedissonMultiLock 对象能够将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例能够来自于不同的 Redisson 实例。
当然,这是官网的介绍,具体是什么?一起看看联锁 MultiLock 应用以及源码吧!
MultiLock 应用
依照官网文档的说法,这里 Redisson 客户端能够不是同一个。当然,个别工作中也不会说不必一个客户端吧。
加锁
在浏览 MultiLock 加锁之前,小伙伴应该曾经浏览过一般加锁的相干文章。
源码入口:org.redisson.RedissonMultiLock#lock()
默认超时工夫 leaseTime 没有设置,所以为 -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,如果 remainTime 小于等于 0 了,则阐明加锁超时,间接返回 false。
这样就会执行内部的 while (true)
逻辑,而后从新再走一遍 RedissonMultiLock#tryLock
。
锁开释
看完加锁逻辑,锁开释就更容易了解了。
间接遍历开释锁即可,lock.unlockAsync()
是调用的 RedissonBaseLock#unlockAsync()
办法。
总结
依据我的了解,画图如下:
总体而言,就是将 key1、key2、key3 …… keyN 放到一个 List 汇合中,而后迭代循环加锁,直到所有的都胜利。解锁的时候就是再遍历锁进行开释锁。
相干举荐
- Redisson 分布式锁源码 07:偏心锁开释
- Redisson 分布式锁源码 06:偏心锁排队加锁
- Redisson 分布式锁源码 05:偏心锁加锁