重入机制的简单实现逻辑
- 判断有没有锁,有锁,再继续判断是不是自己加的锁,是自己加的锁,那就update count字段+1
- 如果不是自己加的锁,执行重试机制
- 死循环
- 重试一定次数
if (加锁失败) {
while(true) {
// 重试加锁
if (重试成功) {
return true;
}
// 休息一定时间
}
}
重入后释放锁
- 需要判断重入次数
- 次数为0,直接删锁
- 次数>1 , 次数-1
- 次数<0 , 抛异常
防止死锁
- 如果出现宕机状态,导致一直持有锁没有释放会发生死锁
- 执行定时任务定时扫描,如果超过规定时间则释放
- 如果代码执行太长也会扫描到进行释放,所以还需要一个功能,redis中的watchDog
- 如果代码执行时间太长,则需要重置扫描时间 比如拿到锁十秒后还在执行就要删除锁,但是代码执行时间很长,我们就需要重新设置拿到锁的时间,或者延长时间。
- 执行定时任务定时扫描,如果超过规定时间则释放