前言
相信大家用过Redission吧,那你听过看门狗?没有的话,让鸡腿给你慢慢道来。
如果一个场景:现在有A,B在执行业务,A加了分布式锁,但是生产环境是各种变化的,如果万一A锁超时了,但是A的业务还在跑。而这时由于A锁超时释放,B拿到锁,B执行业务逻辑。这样分布式锁就失去了意义!
那么如何解决?
其实就是锁的续期,比如说我A业务还没跑完,你怎么阔以把我的锁超时释放呢?Redission采用看门狗的方法来延长锁持有的时间。
具体阔以看下我肥朝哥的博客介绍
看门狗
上面链接有源码解释,我们只是做基本的总结,就是在tryAcquire方法上,他会去开一个线程,不断的去跑,当你还没超时的时候,不断给你续命。
具体规则
通过源码分析我们知道,默认情况下,加锁的时间是30秒.如果加锁的业务没有执行完,那么到 30-10 = 20秒的时候,就会进行一次续期,把锁重置成30秒.那这个时候可能又有同学问了,那业务的机器万一宕机了呢?宕机了定时任务跑不了,就续不了期,那自然30秒之后锁就解开了呗.
个人的学习发现
既然有看门狗这个特性,我们怎么用?
在Redission配置上加上
config.setLockWatchdogTimeout(3000L);
上面表示设置为3秒,默认是30秒。既然有默认的,为啥我们还要去设置呢?
因为方便我们测试,等那么久,我都可以训练一组俯卧撑了~
单元测试
RLock lock = redissonClient.getLock("dajitui");
//lock.tryLock(4, TimeUnit.SECONDS);
lock.lock(4, TimeUnit.SECONDS);
Thread.sleep(10000);
if(lock.isHeldByCurrentThread()){
System.out.println("当前仍然锁还在");
lock.unlock();
}
结果发现:lock方法无法续期锁
当使用lock.lock()方法时,它是不会续期的。使用tryLock的时候,显示当前仍然锁还在。说明续期了。
源码走起
lock()
它执行到红色框框就跳出了,只有执行红色框框下面才会走看门狗!
为啥tryLock可以呢?
真相了,它是走红色框框下面的代码。scheduleExpirationRenewal
总结
如果你要用上看门狗机制,使用tryLock方法!