Redis & 线程控制 & 总结

前言


 相关系列

 参考文献

概述


    Redisson基于Redis提供了多项适用于分布式环境的线程控制功能。Redisson的本质是一套由Redis官方提供的Java版API,其提供了包括线程控制工具在内的多项功能,支持在分布式环境中开箱即用。

    Redisson锁支持自动释放。Redisson锁既可以像常规锁定义一样被无限持有至手动释放,也支持在超出指定时间后自动释放,而如此设计的目的则是为了避免客户端断线而导致锁永远无法被解锁的情况发生。此外即使我们对锁进行的是无限加锁,Redisson也会为该锁设置30秒的默认存活时间,并在确保锁依然被正常持有的情况下为之定时延续,从而得以彻底避免死锁现象。
 
 

可重入锁


public void lock() {
   
   
    // ---- 获取(重入)锁。
    RLock rLock = redissonClient.getLock("lock");
    // ---- 无限加锁。
    rLock.lock();
    // ---- 有限加锁。
    // rLock.lock(30L, TimeUnit.SECONDS);
    try {
   
   
        // ---- 逻辑操作。
    } finally {
   
   
        rLock.unlock();
    }
}

    Redisson使用哈希类型来记录可重入锁信息。在Redisson的设计&实现中,其会使用哈希类型来记录可重入锁的数据信息,目的是为了将加锁线程标记/锁重入次数分别作为键/值好一次性保存。Redisson会为欲加锁可重入锁的线程生成UUID以作为唯一标记,以确保只有加锁线程才能执行重入/解锁。可重入锁的本质是独占锁,因此虽说哈希类型支持保存多个键/值对,但可重入锁的锁信息中永远只会存在单个键/值对。

在这里插入图片描述

    Redisson会为“无限加锁”的锁(不限于可重入锁)设置默认存活时间。为了避免网络断连而造成死锁,Redisson会为无限加锁的锁设置30秒的默认存活时间。如此一来即使某客户端与Redis中途断连而导致加锁线程未能手动解锁,Redis也能保证在最迟30秒后将该锁自动删除/解锁,从而确保不会出现其它线程永远无法加锁的死锁情况。

    Redisson会为“无限加锁”的锁(不限于可重入锁)续命/续约。Redisson为无限加锁的锁设置默认存活时间这一点带来的最大问题是:如果加锁线程持有锁的时间超过30秒的默认存活时间,那么不就可能出现其它成功加锁相同锁的情况吗?必然此时该锁已被Redis自动删除/解锁了。事实上正常情况下也确实会如此,因此Redisson还支持为无限加锁的锁进行续命/续约来避免该问题。所谓锁续命/续约是指Redisson会为成功无限加锁的锁同步创建负责监控的Watch Dog @ 看门狗线程,当看门狗线程以10秒的频率监控发现锁依然被正常持有时,其便会将之剩余存活时间重置为初始的30秒,直至锁被手动解锁或因为网络断连而无法更新为止。
 
 

可重入公平锁


public void fairLock() {
   
   
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

说淑人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值