采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
师兄,不知道我上面的理解对不对。lock()是你的逻辑,lock2()是我自己改的。
你的思路我理解,按照这个思路下去,其实是无穷无尽的。
假如我把代码改成这样
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
非常感谢!
你理解的不对,如果已经释放了锁,第一个判断就直接返true了
另外要注意,这里是没有给redis设置过期时间的。
想象一下这个场景,有2个线程。线程1先获得锁执行后面的逻辑,线程2setnx返回了false,继续执行,走到我标注的2个箭头的时候,线程1完成了操作,释放了锁,也就是redis删除了值。这个时候线程2不应该直接获取到锁吗?
师兄,你标注的那个方框,我判断的是ifAbsent为null(因为是包装类可能为null),返回false。当ifAbsent为false时还是会执行后续的逻辑的。 不知道我前面提到的2个线程的的理解是否正确?
这个和我的逻辑不一样吧,师兄你的逻辑是currentValue为空直接返回false了,而我的lock2方法是返回true,我理解是一个线程完成了操作释放了锁,所以得到的空,这个时候就可以获得锁了。
第二个oldValue你的也是为空直接返回false,而我的是返回true,也是同样的道理,一个线程完成了操作释放了锁,所以得到的空,这个时候就可以获得锁了。
你的写法只是把if里的条件拆分了,改成了2个if,运行的结果和我的是是一样的
登录后可查看更多问答,登录/注册
从0到1开发中小型企业级Java应用,并学会迭代重构技巧
8.3k 10
3.3k 4
6.8k 9
2.0k 32
4.1k 26