队列重拍
先说一下当前的加锁状态
- anyLock由客户端A持有
- 队列中是客户端B、客户端C
- 并且客户端B现在是排在头部
那么队列重拍就是队列中某个客户端长时间没有重新申请加锁,没有刷新分数,就会被队列中挤掉。
假设这个长时间没有加锁的客户端是B。
总结
分析代码有些啰嗦,所以先总结流程:
- 客户端B长时间没有加锁,没有刷新时间分数
- 客户端C加锁刷新之后,分数超过了B
- 那就将客户端B的线程从队列中移除,客户端 C变成头部
- 客户端B如果再次申请加锁的话,会排在C的后面
- 这个就是队列重排
过程
恍恍惚惚的,又行进到了10:00:36秒,客户端C来进行的重新尝试进行加锁,此时客户端B他其实在这之前不知道可能因为网络原因或者是别的什么原因,可能他就是没有尝试过重新加锁
进入while true,拿到队列第一个元素的timeout时间,10:00:30 <= 10:00:36,条件成立
zrem redisson_lock_timeout:{anyLock} UUID_02:threadId_02,就从有序集合中将客户端B移除了,lpop redisson_lock_queue:{anyLock},就从队列中将客户端B也移除了

此时队列的第一个元素是客户端C,他的timeout时间是10:00:35 <= 10:00:36,条件成立,从有序集合以及队列中删除掉客户端C
尝试进行加锁,不成立,因为客户端A还持有着那把锁
重新排队入队,pttl
公平锁队列重排原理与实现

最低0.47元/天 解锁文章
1985

被折叠的 条评论
为什么被折叠?



