ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redission分布式锁的几个坑

2022-05-17 01:31:07  阅读:370  来源: 互联网

标签:lockStatus false 几个 rLock unlock Redission tryLock true 分布式


过期时间不续期

tryLock(long time, TimeUnit unit) 会等待指定的时间,如果时间到了还没获得锁就返回 false;如果在时间范围内获得了锁就立刻返回 true,不用等待时间结束。

无论是返回 true 还是 false,都会继续执行之后的代码。

        RLock rLock=redisson.getLock("key");
        Boolean lockStatus =rLock.tryLock(1, TimeUnit.MINUTES);
        if (lockStatus){
            //todo
        }

使用tryLock无参方法时,redisson会自动添加一个定时任务,定时刷新锁的失效时间,如果unlock时失败(比如kill -9项目),则会出现该锁一直不释放的情况。

而当tryLock传释放时间时,则不会添加这个定时任务。

解锁报错

        finally {
            if (lockStatus){
                rLock.unlock();
            }
        }

代码的意思是,如果当时获取到了锁,最终就要unLock();

看起来没问题,但如果lockStatus是true,但是到rLock.unLock()的时候 锁过期自动释放了,那么解锁的代码就会报错(因为释放的时候 并没有锁)

所以应该改成这样:释放的时候重新检测一下是不是持有锁。

        finally {
            if (rLock.isLocked()){
                rLock.unlock();
            }
        }

Lock和tryLock的区别

1: lock拿不到锁会一直等待。tryLock是去尝试,拿不到就返回false,拿到返回true。

2:tryLock是可以被打断的,被中断 的,lock是不可以

 

标签:lockStatus,false,几个,rLock,unlock,Redission,tryLock,true,分布式
来源: https://www.cnblogs.com/ssskkk/p/16279323.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有