共计 516 个字符,预计需要花费 2 分钟才能阅读完成。
前言
后面曾经理解到了,可重入锁加锁,看门狗以及锁的互斥阻塞。
当锁加锁胜利之后,锁是如何开释的?
被动开释
源码入口:RedissonLock#unlock
在解锁时会获取以后线程的 id。
一路往里跟,间接来到 RedissonLock#unlockInnerAsync
:
剖析一下 lua 脚本的内容:
- 如果锁不存在,间接返回 null;
如果锁存在,则对锁的重入次数 -1;
- 残余重入次数大于 0,从新设置过期工夫,返回 0;
- 残余重入次数不大于 0,删除 redis key 并公布音讯,返回 1;
被动开释锁这块思考的不仅仅是对 key 进行解决,因为可能存在重入锁,所以会先对 redis key 对应的 hash value 进行递加,相当于减去重入次数。
主动开释
相比拟被动开释,主动开释就比拟容易了解了。
- 当服务宕机时,看门狗不再看门,那么最多 30s 之后锁被主动开释;
- 当设置锁的工夫时,锁到了工夫,主动开释。
总结
Redisson 锁的开释分为两种:
- 被动开释:本人调用 API unlock 即可;
- 宕机 / 到期主动开释:Redis key 指定工夫主动过期。
相干举荐
- Redisson 分布式锁源码 03:可重入锁互斥
- Redisson 分布式锁源码 02:看门狗
- Redisson 分布式锁源码 01:可重入锁加锁
正文完