请稍等 ...
×

采纳答案成功!

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

关于A线程删除B线程上的Redis锁的问题

这边老师使用了Thread Id来去在解锁的时候自己判断一下是否是自己,否则别删除,但是我想这似乎依然不能解决两个线程同时操作的问题,假如Thread A获取到了锁,然后由于GC停顿或者是等待长时间的IO,在未执行任何任务之前停止运行,导致失去了锁,Thread B获取到了锁,开始执行自己临界区的任务,此时A停顿结束,开始也执行自己的任务,这样也会导致临界区被同时执行,这样的情况如何去处理

正在回答 回答被采纳积分+3

1回答

InCowboy 2021-04-05 21:08:51

看的很仔细,这个得一个一个解决比如提到的锁的过期问题,在Redisson里面有一个watch dog的机制就是专门给锁“续命”的,至于你说到的gc,就是比如redis内存满了吧,那么这情况只能通过监控提醒了

0 回复 有任何疑惑可以回复我~
  • 提问者 慕粉4331336 #1
    是这样,假如A线程获取了锁,但是这个时候A所在的虚拟机发生了很长时间的无响应,没有人续命,可能是长时间的STW,这样的话A刚获取锁之后发生了上面描述的情况,锁超时之后B进程获取了锁,但是B获取锁之后,A进程恢复了,然后A以为自己依然获取了锁,执行临界区代码,这种情况怎么避免呢
    回复 有任何疑惑可以回复我~ 2021-04-05 22:27:55
  • InCowboy 回复 提问者 慕粉4331336 #2
    这种情况下没法避免呢,这个情况如果不续命应该属于比较极端的了吧,你是目前遇到这种情况了吗
    回复 有任何疑惑可以回复我~ 2021-04-06 20:51:09
  • 提问者 慕粉4331336 回复 InCowboy #3
    没有,只是想到的。
    回复 有任何疑惑可以回复我~ 2021-04-06 23:05:16
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信