乐趣区

关于java:Redisson-分布式锁源码-08MultiLock-加锁与锁释放

前言

基于 Redis 的 Redisson 分布式联锁 RedissonMultiLock 对象能够将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例能够来自于不同的 Redisson 实例。

当然,这是官网的介绍,具体是什么?一起看看联锁 MultiLock 应用以及源码吧!

MultiLock 应用

依照官网文档的说法,这里 Redisson 客户端能够不是同一个。当然,个别工作中也不会说不必一个客户端吧。

加锁

在浏览 MultiLock 加锁之前,小伙伴应该曾经浏览过一般加锁的相干文章。

源码入口:org.redisson.RedissonMultiLock#lock()

默认超时工夫 leaseTime 没有设置,所以为 -1。

这块办法太长,咱们拆分进行浏览。

  1. 根底等待时间 baseWaitTime = 锁数量 * 1500,在这里就是 4500 毫秒;
  2. leaseTime == -1 所以 waitTime = baseWaitTime,也就是 4500;
  3. 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:偏心锁加锁
退出移动版