ReadWriteLock读写锁

文章介绍了如何使用Redisson的ReadWriterLock实现读写锁机制。在并发环境下,读写锁确保了写操作的互斥性和读操作的共享性,从而保证数据的最新状态。写锁在更新数据后释放,之后读锁可以获取并显示最新值。通过示例代码展示了读写锁的用法,包括写锁的获取与释放以及读锁的获取与释放过程。
摘要由CSDN通过智能技术生成

ReadWriteLock读写锁

并发写需要等待,并发读等于无锁
在这里插入图片描述

  • 读和写是同一把锁控制
  • 只要写锁没释放,读锁就必须等待,反之一样
  • 允许多个读锁 和 仅允许一个 写锁
  • 读锁是共享锁,写锁是排他锁(互斥锁)
  • 读写锁是同一把锁 RReadWriteLock lock = redissonClient.getReadWriteLock(“rw-lock”); get set取值也是同一个对象

需求:保证获取的是最新的数据? 怎么操作?

更新完数据就释放写锁,定时任务 判断锁是否存在,如果锁存在,等锁释放后取值

在这里插入图片描述

这里是先执行写锁再执行读锁,当写锁释放时,写锁读锁同时渲染数据在这里插入图片描述

 //写锁
    @GetMapping("/write")
    @ResponseBody
    public String writeValue(){
        //读写锁是同一把锁
        RReadWriteLock lock = redissonClient.getReadWriteLock("rw-lock");
        RLock writeLock = lock.writeLock();
        String uuid = "";
        try {
            uuid = UUID.randomUUID().toString();
            writeLock.lock();
            System.out.println("写锁占用成功");
            Thread.sleep(30000);
            redisTemplate.opsForValue().set("writeValue", uuid);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //写锁释放,读锁才能使用
            writeLock.unlock();
            System.out.println("写锁释放完成");
        }

        return uuid;
    }

    //读锁
    @GetMapping("/read")
    @ResponseBody
    public String readValue(){
        RReadWriteLock lock = redissonClient.getReadWriteLock("rw-lock");
        RLock readLock = lock.readLock();
        String uuid = "";
        try {
            readLock.lock();
            uuid = redisTemplate.opsForValue().get("writeValue");
            System.out.println("读锁占用成功");
            Thread.sleep(30000);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            readLock.unlock();
            System.out.println("读锁释放完成");
        }

        return uuid;

    }


先读后写,读锁释放,写锁才能占用,这里就可以看出来读和写是同一把锁
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值