前言看门狗机制在RedissonBaseLock#scheduleExpirationRenewal方法中,这个公平锁和非公平锁没有区别。上面我们已经了解到,公平锁锁失败后,会将当前锁放入等待队列,通过Java代码中的循环不断尝试获取锁。1.锁释放主动释放源码:RedissonFairLock#unlockInnerAsyncKEYS[1]:锁名,anyLock;KEYS[2]:锁等待队列,redisson_lock_queue:{anyLock};KEYS[3]:等待队列中的线程锁时间集合,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当前时间戳。这段逻辑突出的部分已经标出来了,重点是释放锁。锁在队列中,超时直接从队列中移除;锁减少了重新进入的次数。减少后,如果重入次数大于0,则重新设置超时时间,如果不大于0,则直接解除锁。在这种情况下,其他线程将开始从等待队列中获取锁。超时删除在加锁和释放锁的Lua脚本中,第一段总是whiletruedoxxx,用于移除队列中的超时锁。持有锁的线程的释放和非公平锁没有区别。当锁超时或服务宕机时,锁会自动释放。(这里指的是anyLock)。2.总结公平锁的释放也分为主动释放和超时释放。主动释放,即自己调用释放锁。超时删除又分为两种,一种是持锁线程超时删除,和非公平锁没什么区别,因为这个锁也包含了超时时间+看门狗更新。另一种是等待队列中的超时删除,就是在每次获取锁之前先判断第一个等待线程的时间戳是否超时,从而去除锁。本文转载自微信公众号“程序员小航”,可通过以下二维码关注。转载本文请联系程序员小航公众号。
