看门狗机制是在 RedissonBaseLock#scheduleExpirationRenewal
方法中,这块公平锁和非公平锁并无区别。
前文已经了解到,公平锁加锁失败之后,会将当前放到等待队列中,通过 Java 代码中的循环不断尝试获得锁。
源码:RedissonFairLock#unlockInnerAsync
anyLock
;redisson_lock_queue:{anyLock}
;redisson_lock_timeout:{anyLock}
,是按照锁的时间戳存放到集合中的;redisson_lock__channel:{anyLock}
;58f6c4a2-9908-4957-b229-283a45359c4b:47
;这块逻辑突出部分已经标出,重点就是释放锁。
这样的话后续就其他线程从等待队列中开始获得锁。
在加锁和释放锁的 lua 脚本中,第一段永远是一个 while true do xxx
,作用就是用来移除队列中超时的锁。
而持锁线程的释放,则和非公平锁没有任何区别,当锁超时或者服务宕机,锁就会被自动释放。(这个是指 anyLock)。
公平锁的释放同样分为主动释放和超时释放。
- <End /> -