• Redission分布式锁的几个坑


    过期时间不续期

    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是不可以

  • 相关阅读:
    CodeForces
    POJ
    POJ 2260 Error Correction 模拟 贪心 简单题
    POJ
    HDU
    UVA
    CodeForces
    CodeForces
    常见的医学图像成像(总)
    ADNI数据集相关概念整理
  • 原文地址:https://www.cnblogs.com/ssskkk/p/16279323.html
Copyright © 2020-2023  润新知