当前位置: 首页 > news >正文

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

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

文章目录

  • 前言
  • 一、什么叫做锁的重入?
  • 二、Redisson可重入锁原理


前言

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

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


一、什么叫做锁的重入?


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

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

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣ ⁣⁣⁣ 这里举一个例子!下面看一下,我们之前自己定义的锁,能不能去实现锁的重入!!!
在这里插入图片描述
 ⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣ ⁣⁣⁣ 上图显然不能实现!!! 牵涉到多次调用同一把锁,可能会形成死锁现象。


二、Redisson可重入锁原理

⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣ ⁣⁣⁣ 这个时候我们想到一种办法,那就是:当我们去获取锁的时候,采用hash数据结构存储,不仅仅存储线程标识,还要存储可重入的次数(核心)。结构如下图一样!!!
 ⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣上面这一句话要理解,他的其实现的思想就是如此。
在这里插入图片描述
 ⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣⚡⚡⚡ 具体执行原理:当我们去获取锁的时候,采用hash结构,不仅仅存储线程标识,还要存储可重入的次数,第一次获取锁我们就把次数+1,当别的线程再来去获取的锁的时候,他先去判断这个锁是不是有人了,有人获取锁不代表失败!!这个时候他再去判断一下这个获取锁的线程标识是不是自己!不是自己就放弃!!是自己的话,这个时候他再去获取锁,然后把次数再+1,然后执行自己的业务,执行完业务这个时候释放锁时,要先去判断这个线程标识 是不是自己的!不是自己的什么都不做!是自己的,这个时候呢,把次数-1,然后判断是不是为0,为0说明这个时候没有线程是获取锁的状态,这个时候就可以把锁直接删除!!不为0,说明当前的线程获取锁在执行其他的业务,我们不要管就行了,然后就结束了!!!!
 ⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣上面一段话,就是实现可重入锁的核心原理个人见解。其实不难理解的
 
 ⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣对应的图,可大致如下:
在这里插入图片描述
 ⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣一定是次数为0,这个时候删除锁!!!不为0,说明有人在用!!!
 
 ⁣⁣⁣⁣ ⁣ ⁣⁣⁣⁣⁣⁣这个图,自己画的有些草率,但不妨碍理解,结合上面我总结的,你可以去跟一遍流程就OK了!!!上图是原理的大致展示,有一些细节上面展示的不到位!!!(你去看源码他的流程,其内容也就是我上面展示的这些)


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


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【全面介绍Pip换源】
  • 【密码学】密码学数学基础:剩余系
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十四)-无人机操控关键绩效指标(KPI)框架
  • Vue3 前置知识
  • 基于hive数据库的泰坦尼克号幸存者数据分析
  • starRocks搭建
  • 14、Python之super star:一颗星、两颗星,满天都是小星星
  • Rust 版本升级:rustup update stable 报错
  • 2300. 咒语和药水的成功对数
  • BUUCTF逆向wp [MRCTF2020]Transform
  • 【Linux】多线程_7
  • Spring解决循环依赖:三级缓存
  • 17-3 向量数据库之野望3 - SingleStoreDB 实践教程
  • MongoDB教程(六):mongoDB复制副本集
  • ant design form动态增减表单项Form.List如何进行动态校验规则
  • 【翻译】babel对TC39装饰器草案的实现
  • angular学习第一篇-----环境搭建
  • Js基础知识(四) - js运行原理与机制
  • Mac转Windows的拯救指南
  • Meteor的表单提交:Form
  • Spring框架之我见(三)——IOC、AOP
  • tweak 支持第三方库
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 协程
  • 与 ConTeXt MkIV 官方文档的接驳
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 怎样选择前端框架
  • 终端用户监控:真实用户监控还是模拟监控?
  • elasticsearch-head插件安装
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • scrapy中间件源码分析及常用中间件大全
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • $(selector).each()和$.each()的区别
  • %@ page import=%的用法
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (70min)字节暑假实习二面(已挂)
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (备份) esp32 GPIO
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十)Flink Table API 和 SQL 基本概念
  • (十三)MipMap
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)视频码率,帧率和分辨率的联系与区别
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu