Redisson分布式锁源码_07_公平锁释放

前言

看门狗机制是在 RedissonBaseLock#scheduleExpirationRenewal 方法中,这块公平锁和非公平锁并无区别。

前文已经了解到,公平锁加锁失败之后,会将当前放到等待队列中,通过 Java 代码中的循环不断尝试获得锁。

1

锁释放

主动释放

源码:RedissonFairLock#unlockInnerAsync

  1. KEYS[1]:加锁的名字,anyLock
  2. KEYS[2]:加锁等待队列,redisson_lock_queue:{anyLock}
  3. KEYS[3]:等待队列中线程锁时间的 set 集合,redisson_lock_timeout:{anyLock},是按照锁的时间戳存放到集合中的;
  4. KEYS[4]:redisson_lock__channel:{anyLock}
  5. ARGV[1]:LockPubSub.UNLOCK_MESSAGE;
  6. ARGV[2]:锁超时时间 30000;
  7. ARGV[3]:UUID:ThreadId 组合 58f6c4a2-9908-4957-b229-283a45359c4b:47
  8. ARGV[4]:currentTime 当前时间戳。

图片

这块逻辑突出部分已经标出,重点就是释放锁。

  1. 锁在队列中,超时了则直接从队列中移除;
  2. 锁减少重入次数,减少后,如果重入次数大于 0,重置超时时间,如果不大于 0,则直接移除锁。

这样的话后续就其他线程从等待队列中开始获得锁。

超时删除

图片

在加锁和释放锁的 lua 脚本中,第一段永远是一个 while true do xxx,作用就是用来移除队列中超时的锁。

而持锁线程的释放,则和非公平锁没有任何区别,当锁超时或者服务宕机,锁就会被自动释放。(这个是指 anyLock)。

2

总结

公平锁的释放同样分为主动释放和超时释放。

  1. 主动释放,即自己调用释放锁。
  2. 超时删除,则分为两种,一种是持锁线程超时删除,这种和非公平锁没有任何区别,因为这个锁也是含有超时时间+看门狗续租的。另一种则是等待队列中的超时删除,是在每次获取锁之前,判断第一个等待线程的时间戳是否超时,从而移除锁。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值