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

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

文章目录

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


前言

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

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


一、什么叫做锁的重入?


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

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

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


二、Redisson可重入锁原理

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


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46508.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发面试题C#,.NET知识点(续)

1.C#中的封装是什么,以及它的重要性。 封装(Encapsulation) 是面向对象编程(OOP)的一个基本概念。它指的是将对象的状态(属性)和行为(方法)绑定在一起,并且将…

昇思25天学习打卡营第14天 | ShuffleNet图像分类

昇思25天学习打卡营第14天 | ShuffleNet图像分类 文章目录 昇思25天学习打卡营第14天 | ShuffleNet图像分类ShuffleNetPointwise Group ConvolutionChannel ShuffleShuffleNet模块网络构建 模型训练与评估数据集训练模型评估模型预测 总结打卡 ShuffleNet ShuffleNetV1是旷世科…

鸿蒙实训笔记

第一天 #初始化一个新的NPM项目(根据提示操作) npm init #安装TSC、TSLint和NodeJS的类型声明 npm install -s typescript tslint types/node 在根目录中新建一个名为tsconfig.json的文件,然后在代码编辑器中打开,写入下述内容: {"co…

租用海外服务器需要考虑哪些因素

当企业选择租用海外服务器时需要考虑到哪些因素呢? 对于海外服务器的租用我们需要考虑到机房的位置以及服务器的稳定性如何,所以企业可以选择离目标用户群体比较近一点的机房,以此来降低服务器的延迟度并且能够提高用户的访问速度。 对于机房…

MATLAB激光通信和-积消息传递算法(Python图形模型算法)模拟调制

🎯要点 🎯概率论和图论数学形式和图结构 | 🎯数学形式、图结构和代码验证贝叶斯分类器算法:🖊多类型:朴素贝叶斯,求和朴素贝叶斯、高斯朴素贝叶斯、树增强贝叶斯、贝叶斯网络增强贝叶斯和半朴素…

网络层重点协议—IP协议

在复杂的网络环境中确定一个合适的路径 协议头格式如下: 4位版本号(version) 指定协议的版本(IPV4-4,IPV6-6) 4位首部长度(header length) IP头部的长度是多少个32bit,也就是length*4的字节数。4bit表示最大的数字是15&#x…

大模型日报 2024-07-14

大模型日报 2024-07-14 大模型资讯 ⏩6700 万参数比肩万亿巨兽 GPT-4!微软 MIT 等联手破解 Transformer 推理密码 微软、MIT 等机构的学者提出创新训练范式,攻破大模型推理缺陷。通过因果模型构建数据集,教模型学习公理,67M 参数的…

【密码学】密码学数学基础:群的定义

一、群的定义 在密码学中,群(Group)的概念是从抽象代数借用来的,它是一种数学结构,通常用于描述具有特定性质的运算集合。 群的定义 群定义中的几个关键要素: 集合:首先,群是由一系…

PyMuPDF 包读取pdf文档时,span里的flags属性代表什么

在 PyMuPDF(也称为 fitz)库中,flags 属性表示文本的格式化信息。flags 是一个整数,它包含了不同位(bits)的标志,每个位代表文本的一种属性。这些标志位可以组合在一起表示复杂的文本格式。 具体…

AutoMQ 中的元数据管理

本文所述 AutoMQ 的元数据管理机制均基于 AutoMQ Release 1.1.0 版本 [1]。 01 前言 AutoMQ 作为新一代基于云原生理念重新设计的 Apache Kafka 发行版,其底层存储从传统的本地磁盘替换成了以对象存储为主的共享存储服务。对象存储为 AutoMQ 带来可观成本优势的…

draggable 实现一个简单的拖拽

拖拽区域代码 <draggable v-if="activeFirstIndex !== 8" :list="showResourseList" :group="{ name: resources, pull: clone, put: false }" :sort="false" :multiple="false" :move="onMove1" @end="…

qt 让一个控件可见和不可见

在Qt中&#xff0c;要让一个控件&#xff08;如按钮、文本框等&#xff09;可见或不可见&#xff0c;可以使用QWidget类的setVisible()方法。setVisible()方法接受一个布尔值参数&#xff0c;true表示控件可见&#xff0c;false表示控件不可见。 以下是一个简单的示例&#xf…

android studio 怎么下载 buildTool

在Android Studio中下载Build Tools&#xff0c;通常可以通过Android Studio内置的SDK Manager来完成。以下是详细的步骤&#xff1a; 一、通过Android Studio的SDK Manager下载Build Tools 启动Android Studio&#xff1a;首先&#xff0c;确保你已经安装了Android Studio&am…

Java编程基础入门——构建你的第一个Java程序

Java&#xff0c;作为一门广泛使用的编程语言&#xff0c;以其“一次编写&#xff0c;到处运行”的特性而闻名于世。无论是开发企业级应用、Android移动应用&#xff0c;还是进行大数据处理&#xff0c;Java都扮演着举足轻重的角色。对于初学者而言&#xff0c;掌握Java编程基础…

【JavaScript 算法】冒泡排序:简单有效的排序方法

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 冒泡排序&#xff08;Bubble Sort&#xff09;是一种基础的排序算法&#xff0c;通过重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它…

【香橙派 AIpro测评:探索高效图片分类项目实战】

前言 最近入手了一块香橙派 AIpro开发板&#xff0c;在使用中被它的强大深深震撼&#xff0c;有感而发写下这篇文章。 本文旨在深入探讨OrangePi AIpro的各项性能&#xff0c;从硬件配置、软件兼容性到实际应用案例&#xff0c;全方位解析这款设备如何在开源社区中脱颖而出&am…

在 RocketMQ 中实现消息的幂等性

在 RocketMQ 中实现消息的幂等性可以通过以下几种常见的方式: 1. 使用唯一标识符: 为每条消息生成一个唯一的标识符,例如 UUID 或者基于业务逻辑的唯一键。在消费端,接收到消息后,首先根据这个唯一标识符检查是否已经处理过该消息。如果已经处理过,则直接忽略,否则进行处…

案例 | 人大金仓助力山西政务服务核心业务系统实现全栈国产化升级改造

近日&#xff0c;人大金仓支撑山西涉企政策服务平台、政务服务热线联动平台、政务网、办件中心等近30个政务核心系统完成全栈国产化升级改造&#xff0c;推进全省通办、跨省通办、综合业务受理、智能审批、一件事一次办等业务的数字化办结进程&#xff0c;为我国数字政务服务提…

Django ORM中ExpressionWrapper的用途

ExpressionWrapper 在 Django ORM 中&#xff0c;直接在 filter 方法中进行字段间的比较时&#xff0c;不能直接使用算术运算符&#xff08;如 、-、*、/&#xff09;来操作 F 对象&#xff0c;需要使用 ExpressionWrapper 来包装表达式并指定输出字段类型。 使用Q对象&#…

数据结构(Java):LinkedList集合Stack集合

1、集合类LinkedList 1.1 什么是LinkedList LinkedList的底层是一个双向链表的结构&#xff08;故不支持随机访问&#xff09;&#xff1a; 在LinkedList中&#xff0c;定义了first和last&#xff0c;分别指向链表的首节点和尾结点。 每个节点中有一个成员用来存储数据&…