Redisson分布式锁学习总结:RedissonMultiLock 如何同时锁住N个资源

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

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,毕竟这两个是一对的,计算后,进入死循环尝试获取锁,下面我们直接在源码处加注释进行分析。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值