请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Redis分布式锁释放锁的疑问

图片描述

师兄,不知道我上面的理解对不对。lock()是你的逻辑,lock2()是我自己改的。

正在回答

4回答

你的思路我理解,按照这个思路下去,其实是无穷无尽的。

假如我把代码改成这样

public boolean lock(String key, String value) {
    String currentValue = redisTemplate.opsForValue().get(key);
    if (StringUtils.isEmpty(currentValue)) {
        return true;
    }

是不是发现不要setIfAbsent的判断也可以。

if(redisTemplate.opsForValue().setIfAbsent(key, value)) {
    return true;
}

总的说来,课程里写法还无法百分之百保证锁。我看你非常感兴趣,你可以看看这篇文章https://mp.weixin.qq.com/s/JTsJCDuasgIJ0j95K8Ay8w

另外,我推荐使用 https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter


0 回复 有任何疑惑可以回复我~
  • 提问者 曲线J #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-11-04 21:35:34
廖师兄 2019-10-31 15:18:54

https://img1.sycdn.imooc.com/szimg/5dba8a3009cf43bb07650430.jpg

你理解的不对,如果已经释放了锁,第一个判断就直接返true了

if(redisTemplate.opsForValue().setIfAbsent(key, value)) {
    return true;
}

另外要注意,这里是没有给redis设置过期时间的。

0 回复 有任何疑惑可以回复我~
  • 提问者 曲线J #1
    想象一下这个场景,有2个线程。线程1先获得锁执行后面的逻辑,线程2setnx返回了false,继续执行,走到我标注的2个箭头的时候,线程1完成了操作,释放了锁,也就是redis删除了值。这个时候线程2不应该直接获取到锁吗?
    回复 有任何疑惑可以回复我~ 2019-10-31 15:28:58
  • 提问者 曲线J #2
    师兄,你标注的那个方框,我判断的是ifAbsent为null(因为是包装类可能为null),返回false。当ifAbsent为false时还是会执行后续的逻辑的。
    
    不知道我前面提到的2个线程的的理解是否正确?
    回复 有任何疑惑可以回复我~ 2019-11-01 10:03:03
提问者 曲线J 2019-10-31 14:54:42

https://img1.sycdn.imooc.com//szimg/5dba83d809bd853613340962.jpg

这个和我的逻辑不一样吧,师兄你的逻辑是currentValue为空直接返回false了,而我的lock2方法是返回true,我理解是一个线程完成了操作释放了锁,所以得到的空,这个时候就可以获得锁了。


第二个oldValue你的也是为空直接返回false,而我的是返回true,也是同样的道理,一个线程完成了操作释放了锁,所以得到的空,这个时候就可以获得锁了。






0 回复 有任何疑惑可以回复我~
廖师兄 2019-10-31 14:18:02

你的写法只是把if里的条件拆分了,改成了2个if,运行的结果和我的是是一样的

0 回复 有任何疑惑可以回复我~

相似问题

登录后可查看更多问答,登录/注册

问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信