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

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

文章目录


前言

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

 

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


一、什么叫做锁的重入?

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

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

 ⁣⁣⁣⁣ ⁣⁣⁣⁣

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

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

二、Redisson可重入锁原理

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

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

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

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

 

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

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

 

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

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

相关推荐
长春的KAKA6 小时前
GitLab 项目页面报 500 错误的完整修复记录:PostgreSQL 数据库损坏、统计表缺失及数据库迁移
数据库·postgresql·gitlab
这个DBA有点耶6 小时前
关系数据库管理系统选型指南:四步决策框架与主流产品技术路线对比
数据库·sql·程序人生·mysql·database·dba
jason.zeng@15022077 小时前
(七)「固化 Rest 接口 + Text-to-SQL 灵活查询」双模式 Agent 架构教程
数据库·python·sql·ai·架构·langchain·ai编程
我不会起名字3227 小时前
MVCC 快照读为什么读不到刚提交的数据:ReadView 的 4 条可见性规则
数据库·mysql·innodb·mvcc·事务隔离
2501_933670797 小时前
2027届数据类专业投用户增长岗:A/B实验、指标和SQL准备思路
数据库·sql
用户337922545687 小时前
Sirchmunk 深度解析(一):一个无需向量数据库的自进化搜索引擎架构设计
数据库
染指11108 小时前
139.Agent-多Agent框架-Skills渐进式加载文档
数据库·人工智能·langchain·agents
骑着蜗牛撵大象3278 小时前
SpringBoot+Vue3 企业智能体侧挂架构:独立服务、独立数据库与主线零侵入落地
数据库·spring boot·架构·vue·springboot·事件驱动·服务拆分
螺蛳粉 螺蛳粉8 小时前
第四篇:Keepalived + MySQL 主从高可用实战
数据库·mysql·adb·keepalived·高可用
麦壳饼8 小时前
INSERT INTO:向时序表写入数据
数据库·sonnetdb