关于redis:Redisson-分布式锁源码-07公平锁释放

前言

看门狗机制是在 RedissonBaseLock#scheduleExpirationRenewal 办法中,这块偏心锁和非偏心锁并无区别。

前文曾经理解到,偏心锁加锁失败之后,会将以后放到期待队列中,通过 Java 代码中的循环不断尝试取得锁。

锁开释

被动开释

源码: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)。

总结

偏心锁的开释同样分为被动开释和超时开释。

  1. 被动开释,即本人调用开释锁。
  2. 超时删除,则分为两种,一种是持锁线程超时删除,这种和非偏心锁没有任何区别,因为这个锁也是含有超时工夫+看门狗续租的。另一种则是期待队列中的超时删除,是在每次获取锁之前,判断第一个期待线程的工夫戳是否超时,从而移除锁。

相干举荐

  • Redisson 分布式锁源码 06:偏心锁排队加锁
  • Redisson 分布式锁源码 05:偏心锁加锁
  • Redisson 分布式锁源码 04:可重入锁开释

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据