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,一经查实,立即删除!

相关文章

昇思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…

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

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

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="…

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

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

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

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

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

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

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

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

构建高效智能标准化仓库

在快节奏的现代商业环境中&#xff0c;仓库作为供应链的核心枢纽&#xff0c;其运营效率与管理水平直接影响着企业的整体竞争力。一个“高效智能标准化的仓库”&#xff0c;不仅是货物有序存储的空间&#xff0c;更是降本增效、提升客户满意度的关键所在。 在传统工厂管理模式下…

AI Agent 开发综合指南

本文介绍了 ReAct 模式以改进功能&#xff0c;并演示了如何从头开始创建 AI 代理。它涵盖了测试、调试和优化 AI 代理&#xff0c;以及工具、库、环境设置和实施。本教程为用户提供了创建有效 AI 代理所需的技能&#xff0c;无论他们是开发人员还是爱好者。 NSDT工具推荐&#…

【Linux】01.Linux 的常见指令

1. ls 指令 语法&#xff1a;ls [选项] [目录名或文件名] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息 常用选项&#xff1a; -a&#xff1a;列出当前目录下的所有文件&#xff0c;包含隐藏文件…

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

我在2021年底开始使用Polars和DuckDB。我立刻意识到这些库很快就会成为数据科学生态系统的核心。自那时起&#xff0c;这些库的受欢迎程度呈指数级增长。 在这篇文章中&#xff0c;我做出了一些关于未来几年数据科学领域的发展方向和原因的预测。 这篇文章旨在检验我的预测能力…

开始Linux之路

人生得一知己足矣&#xff0c;斯世当以同怀视之。——鲁迅 Linux操作系统简单操作指令 1、ls指令2、pwd命令3、cd指令4、mkdir指令(重要)5、whoami命令6、创建一个普通用户7、重新认识指令8、which指令9、alias命令10、touch指令11、rmdir指令 及 rm指令(重要)12、man指令(重要…

记录自己Ubuntu加Nvidia驱动从入门到入土的一天

前言 记录一下自己这波澜壮阔的一天&#xff0c;遇到了很多问题&#xff0c;解决了很多问题&#xff0c;但是还有很多问题&#xff0c;终于在晚上的零点彻底放弃&#xff0c;重启windows。 安装乌班图 1.安装虚拟机 我开始什么操作系统的基础都没有&#xff0c;网上随便搜了…

JDBC基础 -获取连接的方式、结果集、批处理、事务处理、连接池、Apache-DBUtils

文章目录 概述快速入门(增删改)获取数据库的五种方式方式一&#xff1a;获取Driver实现类对象方式二&#xff1a;反射方式三&#xff1a;使用DriverManager代替Driver方式四&#xff1a;Class.forName自动完成注册驱动&#xff08;推荐&#xff09;方式五&#xff1a;使用prope…

请你谈谈:BeanDefinition类作为Spring Bean的建模对象,与BeanFactoryPostProcessor之间的羁绊

那么&#xff0c;我们如何理解Spring Bean的建模对象呢&#xff1f;简而言之&#xff0c;它是指用于描述和配置Bean实例化过程的模型对象。有人可能会提出疑问&#xff0c;既然只需要Class&#xff08;类&#xff09;就可以实例化一个对象&#xff0c;Class作为类的元数据&…

springboot websocket 知识点汇总

以下是一个详细全面的 Spring Boot 使用 WebSocket 的知识点汇总 1. 配置 WebSocket 添加依赖 进入maven官网, 搜索spring-boot-starter-websocket&#xff0c;选择版本, 然后把依赖复制到pom.xml的dependencies标签中 配置 WebSocket 创建一个配置类 WebSocketConfig&…