1、连锁
到此,关于 Redisson 的可重入锁、公平锁、读写锁的加锁和释放锁的基本原理都分析完毕了,如果感兴趣的同学,可以到下面的文章看一看:
Redisson分布式锁学习总结:可重入锁 RedissonLock#lock 获取锁源码分析
Redisson分布式锁学习总结:可重入锁 RedissonLock#unlock 释放锁源码分析
Redisson分布式锁学习总结:公平锁 RedissonFairLock#lock 获取锁源码分析
Redisson分布式锁学习总结:公平锁 RedissonFairLock#unLock 释放锁源码分析
Redisson分布式锁学习总结:读锁 RedissonReadLock#lock 获取锁源码分析
Redisson分布式锁学习总结:读锁 RedissonReadLock#unLock 释放锁源码分析
Redisson分布式锁学习总结:写锁 RedissonWriteLock#lock 获取锁源码分析
Redisson分布式锁学习总结:写锁 RedissonWriteLock#unLock 释放锁源码分析
但我们都知道,关于上面的锁,其实锁的都是一个资源;但如果我们需要同时锁定N个资源呢:例如下单的时候,我们需要同时锁定订单、库存、商品等,那 Redisson 有提供对应的分布式锁么?
答案:有
Redisson 提供了一种叫 RedissonMultiLock 的分布式锁,我们这里就叫它连锁吧,就是同时需要连续给指定的N个锁加锁成功,我们才算成功持有锁。
我们看看使用demo:
public class RedissonMultiLockDemo {
public static void main(String[] args) {
RedissonClient redissonClient = RedissonClientUtil.getClient("");
RLock rLock1 = redissonClient.getLock("lock1");
RLock rLock2 = redissonClient.getLock("lock2");
RLock rLock3 = redissonClient.getLock("lock3");
RLock multiLock = redissonClient.getMultiLock(rLock1, rLock2, rLock3);
multiLock.lock();
multiLock.unlock();
}
}
关于 RedissonMultiLock 的原理,其实非常的简单。我们在分析源码之前,可以先简单说一下。配置N个 RedissonLock,加锁就是循环调用 RedissonLock 获取锁的方法,如果三个 RedissonLock 都能成功获取锁,那么 RedissonMultiLock 就成功获取锁;
释放锁的话,也是同样的道理,就是遍历调用 RedissonLock 释放锁的方法即可。
到这里,我们可以明白,分析 RedissonMultiLock 不再需要分析 lua 脚本了,因为它是等同于在 RedissonLock 上面做的扩展了。这里还可以提到一个点,Redisson 实现 RedLock 算法又是基于 RedissonMultiLock 上面改动的,并且改动点少得可怜,等我们分析完 RedissonMultiLock,接着就是 RedissonRedLock 了。
2、源码分析
2.1、同步获取连锁源码分析:
关于源码分析,加锁我们只需要研究 lock() 即可,其他的带等待时间和超时时间的加锁或者是异步获取连锁,其实原理基本都是一致的,底层还是调用 RedissonLock 的加锁方法,只是对于 waitTime、leaseTime 的计算和异步结果的处理会不太一样。
1、lock() 方法
调用无参数的 lockInterruptibly() 方法。
@Override
public void lock() {
try {
lockInterruptibly();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
2、lockInterruptibly() 方法
调用 lockInterruptibly(long leaseTime, TimeUnit unit) 方法,指定 leaseTime 为 -1,即无限持有锁。
@Override
public void lockInterruptibly() throws InterruptedException {
lockInterruptibly(-1, null);
}
3、lockInterruptibly(long leaseTime, TimeUnit unit) 方法
主要是计算 waitTime,毕竟这两个是一对的,计算后,进入死循环尝试获取锁,下面我们直接在源码处加注释进行分析。

本文深入探讨了Redisson的分布式连锁锁(RedissonMultiLock)的原理与实现,通过实例展示了如何使用连锁锁进行多资源锁定。分析了lock()方法的源码,揭示了其内部循环尝试获取锁的机制,并解释了如何处理锁获取失败和超时的情况。此外,还简要提及了连锁锁的释放过程。总结了RedissonMultiLock的关键特性,如基于RedissonLock的扩展、连锁锁的等待时间计算以及在RedissonRedLock中的应用。
最低0.47元/天 解锁文章
3585

被折叠的 条评论
为什么被折叠?



