基于Redis的Redisson分布式可重入读写锁RReadWriteLock ,实现了 juc lock包下的 ReadWriteLock接口。

分布式可重入读写锁允许同时有多个读锁和一个写锁处于加锁状态。

  • ReadWriteLock可以保证一定能读到最新数据,修改期间,写锁是一个排它锁(互斥锁、独享锁),读锁是一个共享锁;
  • 写锁没释放读锁必须等待;
  • 读 + 读 :相当于无锁,并发读,只会在Redis中记录所有当前的读锁。他们都会同时加锁成功;
  • 写 + 读 :必须等待写锁释放;
  • 写 + 写 :阻塞方式;
  • 读 + 写 :有读锁,写也需要等待;
  • 只要有写的存都必须等待;
//读接口
@ResponseBody
@GetMapping("/read")
public String readValue(){String uuid = "";RReadWriteLock readWriteLock = redisson.getReadWriteLock("rw-lock");//加读锁RLock rLock = readWriteLock.readLock();try {rLock.lock();uuid = stringRedisTemplate.opsForValue().get("writeValue");//模拟业务超时,睡10sTimeUnit.SECONDS.sleep(10);} catch (Exception e) {e.printStackTrace();} finally {rLock.unlock();}return uuid;
}//写接口
@ResponseBody
@GetMapping("/write")
public String writeValue(){String uuid = "";RReadWriteLock readWriteLock = redisson.getReadWriteLock("rw-lock");RLock rLock = readWriteLock.writeLock();try {//1、改数据加写锁,读数据加读锁rLock.lock();uuid = UUID.randomUUID().toString();stringRedisTemplate.opsForValue().set("writeValue",uuid);、//模拟业务超时,睡10sTimeUnit.SECONDS.sleep(10);} catch (Exception e) {e.printStackTrace();} finally {rLock.unlock();}return uuid;
}

测试

  • 多次访问/read接口,不会产生阻塞问题;
  • 先访问/write 接口,再访问/read接口;产生阻塞问题,等/write 释放锁,/read才能拿到锁;
  • 多次访问/write 接口,产生阻塞问题;
  • 先访问/read接口,再访问/write 接口;产生阻塞问题;等/read释放锁,/write才能拿到锁;

如果负责储存这个分布式锁的Redis节点宕机以后,而且这个锁正好处于锁住的状态时,这样会产生死锁问题。为了避免这种情况的发生,Redisson内部提供了一个监控锁的看门狗,每加一个锁默认都会设置一个30s的默认时间,在Redisson实例被关闭前,会不断的延长锁的有效期,这样可以有效避免死锁问题。

分布式读写锁 ReadWriteLock相关推荐

  1. JUC系列(八)| 读写锁-ReadWriteLock

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  2. 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...

    信号量semaphore    允许多个线程同时访问 读写锁ReadWriteLock   在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch    obj = new Count ...

  3. Java多线程学习十六:读写锁 ReadWriteLock 获取锁有哪些规则

    读写锁 ReadWriteLock 获取锁有哪些规则呢? 在没有读写锁之前,我们假设使用普通的 ReentrantLock,那么虽然我们保证了线程安全,但是也浪费了一定的资源,因为如果多个读操作同时进 ...

  4. 读写锁ReadWriteLock和缓存实例

    读写锁:多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥.即:读的时候不允许写,写的时候不允许读,可以同时读. synchronized关键字和普通的Lock构造的锁,会造成读与读之间的互斥,因此读写锁 ...

  5. 读写锁ReadWriteLock

    为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率. Java中读写锁有个接口java.util ...

  6. Java之读写锁ReadWriteLock实现

    一.为什么需要读写锁? 与传统锁不同的是读写锁的规则是可以共享读,但只能一个写,总结起来为:读读不互斥,读写互斥,写写互斥,而一般的独占锁是:读读互斥,读写互斥,写写互斥,而场景中往往读远远大于写,读 ...

  7. 对变量移位顺序读写_Java多线程并发读写锁ReadWriteLock实现原理剖析

    关于读写锁 Java语法层面的synchronized锁和JDK内置可重入锁ReentrantLock我们都经常会使用,这两种锁都属于纯粹的独占锁,也就是说这些锁任意时刻只能由一个线程持有,其它线程都 ...

  8. Java并发原理抽丝剥茧,读写锁ReadWriteLock实现深入剖析

    跟着作者的65节课彻底搞懂Java并发原理专栏,一步步彻底搞懂Java并发原理. 作者简介:笔名seaboat,擅长工程算法.人工智能算法.自然语言处理.架构.分布式.高并发.大数据和搜索引擎等方面的 ...

  9. 读写锁(ReadwriteLock)

    读写锁 多个线程同时读一个资源类没有任何问题,所以为了满足并发量,读取共享资源应该可以同时但是,如果有一个线程想去写共享资源,就不应该再有其它线程可以对该资源进行读或写 结果 总结 读-读能共存 读- ...

最新文章

  1. android 代码设置居右_android如何让textview文字居右
  2. 用js取1-100的随机数
  3. ubuntu下svn命令
  4. java调用 火眼臻睛,连接创新,发现未来,臻识科技受邀CCF-GAIR,论道浪潮之巅...
  5. 使用kubeadm安装Kubernetes
  6. 为多用户安装conda_Anaconda软件安装
  7. cnn 回归 坐标 特征图_论文笔记 | CNN 是怎么学到图片绝对位置信息的
  8. springboot开启debug日志_SpringBoot日志快速上手简单配置
  9. mysql句柄是什么意思_句柄是什么?
  10. 对称与非对称密钥加密
  11. C#工厂模式——简单工厂、工厂方法、反射+简单工厂、抽象工厂
  12. 最新win10重装系统官方纯净版——2022家庭版多图详细
  13. python后端需要什么基础_学习Python需要哪些基础知识?_后端开发
  14. android api版本修改,Android 版seesmic修改API方法
  15. three - 3 - 基础知识(1. three渲染结构,2.对canvas 进行响应式布局,3.让canvas 画布自适应设备分辨率 )
  16. android 带手电筒的扫一扫(1 可以自动打开手电筒,2 可以自动对焦,增加识别率)
  17. 无锁实现线程间共享数据
  18. python字符串切片,os模块练习处理
  19. 使用在线编辑 svg 软件修改 svg 图片
  20. 【JMP白皮书下载】 | 可靠性增长之探讨与案例分享

热门文章

  1. 财报之外:评阿里无社会成本的增长及其示范效应
  2. go语言有哪些web框架
  3. vue输入框回车页面刷新
  4. Android 仿UC浏览器详情页评论弹框效果
  5. java获取项目中的路径_通过java获取当前项目路径
  6. 基于RBAC的k8s用户授权示例
  7. 照片 GPS 信息查询
  8. 女人会用脉脉柔情让平淡的生活充满情调
  9. 关于各个数据库的常用数据库引擎介绍
  10. 个人第一次作业——“他山之石,可以攻玉”