Redis分布式锁-Redisson可重入锁原理的个人见解。

记录Redisson可重入锁的个人见解。

文章目录


前言

⁣⁣⁣⁣ ⁣⁣⁣⁣ 之前在写项目的时候,注意到Redisson可重入锁的一个问题,随即在网上搜索其对应的资料,下面就记录一下个人的看法。

⁣⁣⁣⁣ ⁣⁣⁣⁣这里简单介绍一下Redisson,Redisson:通俗来讲它是一个在Redis基础上实现的一个分布式工具的集合,也就是说在分布式系统下,要用到的各种各样的工具它都有,包括分布式锁!!!


一、什么叫做锁的重入?

⁣⁣⁣⁣ ⁣⁣⁣ ⚠️⚠️⚠️ 一个线程里面2次去获取锁,这个就是锁的重入!

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣ ⁣⁣⁣ 典型的就是:一个方法里面包含获取锁,而这个方法又去调用另外一个方法,被调用的这个方法他里面也要去获取锁

⁣⁣⁣⁣ ⁣⁣⁣⁣

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣ ⁣⁣⁣ 这里举一个例子!下面看一下,我们之前自己定义的锁,能不能去实现锁的重入!!!

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣ ⁣⁣⁣ 上图显然不能实现!!! 牵涉到多次调用同一把锁,可能会形成死锁现象。

二、Redisson可重入锁原理

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣ ⁣⁣⁣ 这个时候我们想到一种办法,那就是:当我们去获取锁的时候,采用hash数据结构存储,不仅仅存储线程标识,还要存储可重入的次数(核心) 。结构如下图一样!!!

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣上面这一句话要理解,他的其实现的思想就是如此。

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣⚡⚡⚡ 具体执行原理:当我们去获取锁的时候,采用hash结构,不仅仅存储线程标识,还要存储可重入的次数 ,第一次获取锁我们就把次数+1,当别的线程再来去获取的锁的时候,他先去判断这个锁是不是有人了,有人获取锁不代表失败!!这个时候他再去判断一下这个获取锁的线程标识是不是自己!不是自己就放弃!!是自己的话,这个时候他再去获取锁,然后把次数再+1,然后执行自己的业务,执行完业务这个时候释放锁时,要先去判断这个线程标识 是不是自己的!不是自己的什么都不做!是自己的,这个时候呢,把次数-1,然后判断是不是为0,为0说明这个时候没有线程是获取锁的状态,这个时候就可以把锁直接删除!!不为0,说明当前的线程获取锁在执行其他的业务,我们不要管就行了,然后就结束了!!!!

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣上面一段话,就是实现可重入锁的核心原理个人见解。其实不难理解的

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣对应的图,可大致如下:

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣一定是次数为0,这个时候删除锁!!!不为0,说明有人在用!!!

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣这个图,自己画的有些草率,但不妨碍理解,结合上面我总结的,你可以去跟一遍流程就OK了!!!上图是原理的大致展示,有一些细节上面展示的不到位!!!(你去看源码他的流程,其内容也就是我上面展示的这些)

⁣⁣⁣⁣ ⁣ OK,到这里自己的个人总结,分享完毕!感兴趣的话,评论区可以聊聊。

相关推荐
陈丹阳(滁州学院)2 小时前
若依添加添加监听容器配置(删除键,键过期)
数据库·oracle
远方16093 小时前
14-Oracle 23ai Vector Search 向量索引和混合索引-实操
数据库·ai·oracle
GUIQU.4 小时前
【Oracle】数据仓库
数据库·oracle
恰薯条的屑海鸥4 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
数据库·学习·安全·web安全·渗透测试·网络安全学习
咖啡啡不加糖4 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存
曼汐 .4 小时前
数据库管理与高可用-MySQL高可用
数据库·mysql
MickeyCV4 小时前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
2301_793102494 小时前
Linux——MySql数据库
linux·数据库
喵叔哟4 小时前
第4章:Cypher查询语言基础
数据库
刘 大 望4 小时前
数据库-联合查询(内连接外连接),子查询,合并查询
java·数据库·sql·mysql