https://www.cnblogs.com/ahui-blog/p/17701102.html
如果业务代码没执行完锁却过期了,这时候怎么办?
这不就线程不安全了吗?
别急,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)来完成加锁逻辑,然后判断加锁成功与否,失败的话就重试。
看门狗如何开启的