分布式锁(3)Redisson之MultiLock
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了分布式锁(3)Redisson之MultiLock,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1398字,纯文字阅读大概需要2分钟。
内容图文
![分布式锁(3)Redisson之MultiLock](/upload/InfoBanner/zyjiaocheng/910/d6d0eb633b8b455fb16b2bbbecf6b2da.jpg)
MultiLock
MultiLock:将多个锁合并为一个大锁,对一个大锁进行统一的申请加锁以及释放锁,一次性锁定多个资源,再去处理一些事情,然后事后一次性释放所有的资源对应的锁。
代码示例:
Config config = new Config();
config.useClusterServers()
.addNodeAddress("redis://192.168.31.114:7001")
.addNodeAddress("redis://192.168.31.184:7002");
RedissonClient redisson = Redisson.create(config);
RLock lock1 = redisson.getLock("lock1");
RLock lock2 = redisson.getLock("lock2");
RLock lock3 = redisson.getLock("lock3");
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// locks: lock1 lock2 lock3
lock.lock();
lock.unlock();
核心源码:
根据锁的个数,计算出基础的等待时间。
long baseWaitTime = locks.size() * 1500;
循环尝试获取锁,直到获取锁成功后返回。
while (true) {
if (tryLock(waitTime, leaseTime, unit)) {
return;
}
}
调用RedissonLock的tryLock方法,尝试获取锁,如果获取锁成功,把锁添加到集合。
List<RLock> acquiredLocks = new ArrayList<RLock>(locks.size());
lockAcquired = lock.tryLock();
acquiredLocks.add(lock);
如果获取锁超时就会退出,重新再次死循环尝试获取锁。
if (locks.size() - acquiredLocks.size() == failedLocksLimit()) {
break;
}
if (failedLocksLimit == 0) {
unlockInner(acquiredLocks);
if (waitTime == -1 && leaseTime == -1) {
return false;
}
failedLocksLimit = failedLocksLimit();
acquiredLocks.clear();
// reset iterator
while (iterator.hasPrevious()) {
iterator.previous();
}
} else {
failedLocksLimit--;
}
内容总结
以上是互联网集市为您收集整理的分布式锁(3)Redisson之MultiLock全部内容,希望文章能够帮你解决分布式锁(3)Redisson之MultiLock所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。