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

开发 前端 分布式 Redis
看门狗机制是在 RedissonBaseLock#scheduleExpirationRenewal 方法中,这块公平锁和非公平锁并无区别。

[[408803]]

前言

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

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

1.锁释放

主动释放

源码:RedissonFairLock#unlockInnerAsync

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

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

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

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

超时删除

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

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

2.总结

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

主动释放,即自己调用释放锁。 

超时删除,则分为两种,一种是持锁线程超时删除,这种和非公平锁没有任何区别,因为这个锁也是含有超时时间+看门狗续租的。另一种则是等待队列中的超时删除,是在每次获取锁之前,判断第一个等待线程的时间戳是否超时,从而移除锁。

本文转载自微信公众号「程序员小航」,可以通过以下二维码关注。转载本文请联系程序员小航公众号。

 

责任编辑:武晓燕 来源: 程序员小航
相关推荐

2021-06-30 14:56:12

Redisson分布式公平锁

2021-07-01 09:42:08

Redisson分布式

2021-07-03 17:45:57

分布式Redisson MultiLock

2021-07-06 08:37:29

Redisson分布式

2022-08-04 08:45:50

Redisson分布式锁工具

2021-06-27 21:24:55

RedissonJava数据

2022-06-30 08:04:16

Redis分布式锁Redisson

2021-07-07 07:09:49

Redisson分布式锁源码

2021-06-28 10:51:55

Redisson分布式锁Watchdog

2024-01-02 13:15:00

分布式锁RedissonRedis

2021-07-09 06:48:31

ZooKeeperCurator源码

2021-07-16 07:57:34

ZooKeeperCurator源码

2023-08-27 22:13:59

Redisson分布式缓存

2022-04-14 07:56:30

公平锁Java线程

2018-07-17 08:14:22

分布式分布式锁方位

2021-09-17 07:51:24

RedissonRedis分布式

2018-11-27 16:17:13

分布式Tomcat

2021-07-08 09:21:17

ZooKeeper分布式锁 Curator

2021-11-26 06:43:19

Java分布式

2019-06-19 15:40:06

分布式锁RedisJava
点赞
收藏

51CTO技术栈公众号