乐趣区

关于redis:Redisson-分布式锁源码-04可重入锁释放

前言

后面曾经理解到了,可重入锁加锁,看门狗以及锁的互斥阻塞。

当锁加锁胜利之后,锁是如何开释的?

被动开释

源码入口:RedissonLock#unlock

在解锁时会获取以后线程的 id。

一路往里跟,间接来到 RedissonLock#unlockInnerAsync

剖析一下 lua 脚本的内容:

  1. 如果锁不存在,间接返回 null;
  2. 如果锁存在,则对锁的重入次数 -1;

    1. 残余重入次数大于 0,从新设置过期工夫,返回 0;
    2. 残余重入次数不大于 0,删除 redis key 并公布音讯,返回 1;

被动开释锁这块思考的不仅仅是对 key 进行解决,因为可能存在重入锁,所以会先对 redis key 对应的 hash value 进行递加,相当于减去重入次数。

主动开释

相比拟被动开释,主动开释就比拟容易了解了。

  1. 当服务宕机时,看门狗不再看门,那么最多 30s 之后锁被主动开释;
  2. 当设置锁的工夫时,锁到了工夫,主动开释。

总结

Redisson 锁的开释分为两种:

  1. 被动开释:本人调用 API unlock 即可;
  2. 宕机 / 到期主动开释:Redis key 指定工夫主动过期。

相干举荐

  • Redisson 分布式锁源码 03:可重入锁互斥
  • Redisson 分布式锁源码 02:看门狗
  • Redisson 分布式锁源码 01:可重入锁加锁
退出移动版