锁重入

128 阅读1分钟

重入机制的简单实现逻辑

  • 判断有没有锁,有锁,再继续判断是不是自己加的锁,是自己加的锁,那就update count字段+1
  • 如果不是自己加的锁,执行重试机制
    • 死循环
    • 重试一定次数
if (加锁失败) {
    while(true) {
        // 重试加锁
    if (重试成功) {
        return true;
    } 
        // 休息一定时间
    }
}

重入后释放锁

  • 需要判断重入次数
    • 次数为0,直接删锁
    • 次数>1 , 次数-1
    • 次数<0 , 抛异常

防止死锁

  • 如果出现宕机状态,导致一直持有锁没有释放会发生死锁
    • 执行定时任务定时扫描,如果超过规定时间则释放
      • 如果代码执行太长也会扫描到进行释放,所以还需要一个功能,redis中的watchDog
      • 如果代码执行时间太长,则需要重置扫描时间 比如拿到锁十秒后还在执行就要删除锁,但是代码执行时间很长,我们就需要重新设置拿到锁的时间,或者延长时间。