Redisson 分布式锁源码 04:可重入锁释放
前言
前面已经了解到了,可重入锁加锁,看门狗以及锁的互斥阻塞。
当锁加锁成功之后,锁是如何释放的?
主动释放
源码入口: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 指定时间自动过期。
相关推荐
版权声明: 本文为 InfoQ 作者【程序员小航】的原创文章。
原文链接:【http://xie.infoq.cn/article/690dfde74da4157ce864079f6】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论