本文链接: blog.csdn.net/qq_39017153…
版权
6 篇文章0 订阅
订阅专栏
5 篇文章0 订阅
订阅专栏
公平锁(Fair Lock)
基于Redis的Redisson分布式可重入公平锁也是实现了 java.util.concurrent.locks.Lock 接口的一种 RLock 对象。同时还提供了 异步(Async)、 反射式(Reactive) 和 RxJava2标准 的接口。它保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。所有请求线程会在一个队列中排队,当某个线程出现宕机时,Redisson会等待5秒后继续下一个线程,也就是说如果前面有5个线程都处于等待状态,那么后面的线程会等待至少25秒。
RLock fairLock = redisson.getFairLock("anyLock");
// 最常见的使用方法
fairLock.lock();
// 10秒钟以后自动解锁
// 无需调用unlock方法手动解锁
fairLock.lock(10, TimeUnit.SECONDS);
// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
boolean res = fairLock.tryLock(100, 10, TimeUnit.SECONDS);
fairLock.unlock();
联锁(MultiLock)
基于Redis的Redisson分布式联锁 RedissonMultiLock 对象可以将多个 RLock 对象关联为一个联锁,每个 RLock 对象实例可以来自于不同的Redisson实例。
RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");
RedissonMultiLock lock = new RedissonMultiLock(lock1, lock2, lock3);
// 同时加锁:lock1 lock2 lock3
// 所有的锁都上锁成功才算成功。
lock.lock();
...
lock.unlock();
红锁(RedLock)
基于Redis的Redisson红锁 RedissonRedLock 对象实现了 Redlock 介绍的加锁算法。该对象也可以用来将多个 RLock 对象关联为一个红锁,每个 RLock 对象实例可以来自于不同的Redisson实例。
RLock lock1 = redissonInstance1.getLock("lock1");
RLock lock2 = redissonInstance2.getLock("lock2");
RLock lock3 = redissonInstance3.getLock("lock3");
RedissonRedLock lock = new RedissonRedLock(lock1, lock2, lock3);
// 同时加锁:lock1 lock2 lock3
// 红锁在大部分节点上加锁成功就算成功。
lock.lock();
...
lock.unlock();
读写锁(ReadWriteLock)
基于Redis的Redisson分布式可重入读写锁 RReadWriteLock Java对象实现了 java.util.concurrent.locks.ReadWriteLock 接口。其中读锁和写锁都继承了 RLock 接口。
分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。
RReadWriteLock rwlock = redisson.getReadWriteLock("anyRWLock");
// 最常见的使用方法
rwlock.readLock().lock();
// 或
rwlock.writeLock().lock();
// 10秒钟以后自动解锁
// 无需调用unlock方法手动解锁
rwlock.readLock().lock(10, TimeUnit.SECONDS);
// 或
rwlock.writeLock().lock(10, TimeUnit.SECONDS);
// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
boolean res = rwlock.readLock().tryLock(100, 10, TimeUnit.SECONDS);
// 或
boolean res = rwlock.writeLock().tryLock(100, 10, TimeUnit.SECONDS);
...
lock.unlock();
添加StockController方法:
@GetMapping("test/read")
public String testRead(){
String msg = stockService.testRead();
return "测试读";
}
@GetMapping("test/write")
public String testWrite(){
String msg = stockService.testWrite();
return "测试写";
}
添加StockService方法:
public String testRead() {
RReadWriteLock rwLock = this.redissonClient.getReadWriteLock("rwLock");
rwLock.readLock().lock(10, TimeUnit.SECONDS);
System.out.println("测试读锁。。。。");
// rwLock.readLock().unlock();
return null;
}
public String testWrite() {
RReadWriteLock rwLock = this.redissonClient.getReadWriteLock("rwLock");
rwLock.writeLock().lock(10, TimeUnit.SECONDS);
System.out.println("测试写锁。。。。");
// rwLock.writeLock().unlock();
return null;
}
打开开两个浏览器窗口测试:
- 同时访问写:一个写完之后,等待一会儿(约10s),另一个写开始
- 同时访问读:不用等待
- 先写后读:读要等待(约10s)写完成
- 先读后写:写要等待(约10s)读完成
信号量(Semaphore)
基于Redis的Redisson的分布式信号量( Semaphore)Java对象 RSemaphore 采用了与 java.util.concurrent.Semaphore 相似的接口和用法。同时还提供了 异步(Async)、 反射式(Reactive) 和 RxJava2标准 的接口。
RSemaphore semaphore = redisson.getSemaphore("semaphore");
semaphore.trySetPermits(3);
semaphore.acquire();
semaphore.release();
在StockController添加方法:
@GetMapping("test/semaphore")
public String testSemaphore(){
this.stockService.testSemaphore();
return "测试信号量";
}
在StockService添加方法:
public void testSemaphore() {
RSemaphore semaphore = this.redissonClient.getSemaphore("semaphore");
semaphore.trySetPermits(3);
try {
semaphore.acquire();
TimeUnit.SECONDS.sleep(5);
System.out.println(System.currentTimeMillis());
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
添加测试用例:并发10次,循环一次
控制台效果:
控制台1:
1606960790234
1606960800337
1606960800443
1606960805248
控制台2:
1606960790328
1606960795332
1606960800245
控制台3:
1606960790433
1606960795238
1606960795437
由此可知:
1606960790秒有3次请求进来:每个控制台各1次
1606960795秒有3次请求进来:控制台2有1次,控制台3有2次
1606960800秒有3次请求进来:控制台1有2次,控制台2有1次
1606960805秒有1次请求进来:控制台1有1次
闭锁(CountDownLatch)
基于Redisson的Redisson分布式闭锁( CountDownLatch)Java对象 RCountDownLatch 采用了与 java.util.concurrent.CountDownLatch 相似的接口和用法。
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
latch.trySetCount(1);
latch.await();
// 在其他线程或其他JVM里
RCountDownLatch latch = redisson.getCountDownLatch("anyCountDownLatch");
latch.countDown();
需要两个方法:一个等待,一个计数countDown
给StockController添加测试方法:
@GetMapping("test/latch")
public String testLatch(){
this.stockService.testLatch();
return "班长锁门。。。";
}
@GetMapping("test/countdown")
public String testCountDown(){
this.stockService.testCountDown();
return "出来了一位同学";
}
给StockService添加测试方法:
public void testLatch() {
RCountDownLatch latch = this.redissonClient.getCountDownLatch("latch");
latch.trySetCount(6);
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void testCountDown() {
RCountDownLatch latch = this.redissonClient.getCountDownLatch("latch");
latch.trySetCount(6);
latch.countDown();
}
重启测试,打开两个页面:当第二个请求执行6次之后,第一个请求才会执行。
关注博主即可阅读全文
确定要放弃本次机会?
福利倒计时
: :
立减 ¥
普通VIP年卡可用
关注关注
0
点赞
-
踩
收藏
觉得还不错?
一键收藏
-
知道了
0 评论
redisson中的分布式锁二
它保证了当多个Redisson客户端线程同时请求加锁时,优先分配给先发出请求的线程。所有请求线程会在一个队列中排队,当某个线程出现宕机时,Redisson会等待5秒后继续下一个线程,也就是说如果前面有5个线程都处于等待状态,那么后面的线程会等待至少25秒。1606960795秒有3次请求进来:控制台2有1次,控制台3有2次。1606960800秒有3次请求进来:控制台1有2次,控制台2有1次。1606960805秒有1次请求进来:控制台1有1次。基于Redis的Redisson的分布式信号量(
复制链接
扫一扫
专栏目录
参与评论您还未登录,请先登录后发表或查看评论
08-31
Redis s ion 可重入锁(Reentrant Lock)公平锁(F air Lock)
01-14
4383
Redisson 分布式锁 学习总结:公平锁 Redisson F air Lock# lock 获取锁源码分析
11-16
2004
Redisson 分布式锁 学习总结: Redisson F air Lock# lock 源码分析
12-30
1642
【 Redisson 分布式锁】 Redisson 公平锁实现机制
最新发布
03-05
1319
12-16
SpringBoot集成 Redisson 实现 分布式锁 的方法示例
08-25
08-24
08-29
11-08
574
本文介绍了 Redisson 的公平锁,逻辑大体上和普通可重入锁一致,核心在于 lua 脚本,运用了 Redis 的3种数据类型。
Redisson 分布式锁 学习总结:公平锁 Redisson F air Lock#un Lock 释放锁源码分析
11-18
1270
Redisson 分布式锁 学习总结: Redisson F air Lock#un Lock 源码分析
10-20
2192
07-07
645
Redisson 源码学习之 Redisson F air Lock
12-23
178
Java之—— redis 并发读写锁,使用 Redisson 实现 分布式锁
热门推荐
06-21
4万+
02-05
356
06-11
2566
11-13
851
09-09
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
孟德爱吃香菜CSDN认证博客专家CSDN认证企业博客
码龄7年
暂无认证
1941积分5092粉丝613获赞51评论633收藏
关注
热门文章
- 如何实现Nacos配置文件动态刷新【四种方式】
12019
- 【Jenkins】部署vue项目(多种方式部署)
8023
- idea .gitignore文件不生效(详细步骤排查)
7011
- Linux CentOS 7.9 如何安装Docker
5598
- Thread.currentThread().interrupt() 用法详解
4755
分类专栏
docker 21篇
k8s 13篇
python
maven 2篇
分布式锁 6篇
lua 2篇
Spring Cloud 9篇
开发工具 9篇
Sentinel 3篇
数据库
mysql 3篇
redis 5篇
mongoDB 1篇
Java 28篇
Spring Boot 13篇
日常问题记录 27篇
linux 13篇
jenkins 8篇
nacos 5篇
并发编程 8篇
vue 4篇
java设计模式 7篇
分布式搜索引擎(ES) 4篇
Java算法 7篇
netty 3篇
最新评论
-
如何实现Nacos配置文件动态刷新【四种方式】 848698119: 真棒,优质博文,点赞
-
vue CryptoJS Aes 加密 解密 fksdskjfzxklzk: 感谢大佬分享好文,学到了不少新知识,支持大佬,期待大佬持续输出优质文章!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
-
vue CryptoJS Aes 加密 解密 普通网友: 文章内容通俗易懂,适合不同层次的读者。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
-
vue CryptoJS Aes 加密 解密 普通网友: 文章结构严谨有条,层次分明,读起来一点也不费劲,让人受益匪浅。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
-
Google浏览器插件推荐 普通网友: 写的很好!我也写了一篇获取【大厂面试真题解析、核心开发学习笔记、最新全套讲解视频、实战项目源码讲义、学习路线简历模板】的文章
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
目录
目录
分类专栏
docker 21篇
k8s 13篇
python
maven 2篇
分布式锁 6篇
lua 2篇
Spring Cloud 9篇
开发工具 9篇
Sentinel 3篇
数据库
mysql 3篇
redis 5篇
mongoDB 1篇
Java 28篇
Spring Boot 13篇
日常问题记录 27篇
linux 13篇
jenkins 8篇
nacos 5篇
并发编程 8篇
vue 4篇
java设计模式 7篇
分布式搜索引擎(ES) 4篇
Java算法 7篇
netty 3篇
目录
评论
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元 前往充值 >
需支付:10.00元
取消确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
点击重新获取
扫码支付
钱包余额0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。