https://www.cnblogs.com/ahui-blog/p/17701102.html

Redisson的看门狗watchDog机制

如果业务代码没执行完锁却过期了,这时候怎么办?

这不就线程不安全了吗?

别急,Redssion内部有个看门狗机制,WatchDog!

Redisson内部提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。

默认情况下,看门狗的检查锁的超时时间是30秒钟,也可以通过修改Config.lockWatchdogTimeout来另行指定。

1、啥意思

如果业务代码没执行完,锁却过期了,这时候其他线程又能抢锁了,线程不安全啦。

所以Redisson内部有个看门狗的机制,意思是定时监测业务是否执行结束,没结束的话你这个锁是不是快到期了(超过锁的三分之一时间,比如设置的9s过期,现在还剩6s到期),那就重新续期。

这样防止如果业务代码没执行完,锁却过期了所带来的线程不安全问题。

2、原理

回顾下怎么加锁的?lock()!

highlighter- csharp

RLock lock = redisson.getLock("myLock");lock.lock();

lock()干了啥?

highlighter- reasonml

private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException {long threadId = Thread.currentThread().getId();Long ttl = tryAcquire(-1, leaseTime, unit, threadId);

可以看到lock主要是请求tryAcquire(-1, -1, null, threadId)来完成加锁逻辑,然后判断加锁成功与否,失败的话就重试。

看门狗如何开启的