采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
String oldValue = redisTemplate.opsForValue().getAndSet(key, value); if(!StringUtils.isEmpty(oldValue) && oldValue.equals(currentValue)) { return true; }
这一段代码中,如果两个线程A和B同时访问,A先拿到锁,然后B拿不到锁但是却set了B的值。老师在视频中说A和B的value值相同,但是实际情况并不一定相同吧 。麻烦老师有空回复下哦 谢谢
然后B拿不到锁但是却set了B的值,不是太懂你的意思。
getAndSet这个命令,redis做了控制,同一时刻只会有一个线程执行
抱歉,这么久才看到。 当B线程 执行 getandset这个方法 他先get了值,然后set了B的value 然后判断get到的值 是否等于currentvalue 发现不相等,说明在B之前已经有线程A执行了getandset操作并且拿到锁,但是这时候redis里的key对应的value难道不是B线程刚刚set进去的value吗
getset()方法是将给定 key 的值设为 value ,并返回 key 的旧值(old value)。不是返回新设置的值。
登录后可查看更多问答,登录/注册
从0到1开发中小型企业级Java应用,并学会迭代重构技巧
8.3k 10
3.3k 4
6.8k 9
2.0k 32
4.1k 26