Redis实战案例17-Redisson可重入的原理

news2024/11/17 1:56:23

可重入原理分析

为什么自定义的Redis实现分布式锁不能实现可重入

在这里插入图片描述

method1中调用了method2方法,属于是同一线程内的操作,但是当method1中获取了锁之后,method2中就无法获取锁了,这就是同一线程无法实现可重入;

在这里插入图片描述

如何解决可以参考reentrantlock的原理;

ReentrantLock可以让线程排队获取锁并且支持重复获取。它的原理就像是一个排队等候的系统。
当一个线程想要获取锁时,它会检查锁是否已经被其他线程占用,也就是获取线程的标识。如果被占用(标识不相同),该线程会进入等待状态,排在一个队列中。只有当锁被释放时,下一个线程才能从队列中获取锁。
释放锁: ReentrantLock支持同一个线程再次获取锁,这称为重入。重入锁的意思是,当一个线程已经获取了锁,它可以再次获取这个锁,而不会被阻塞。每次重入操作会增加锁的计数器,当计数器变为0时,锁被完全释放,每个业务释放一次锁就减一,为0时说明在该线程下业务的最外层,才能释放锁

所以在key-value结构中value就不能使用string类型,而是使用hash结构,记录锁的计数器;

在这里插入图片描述

之前的业务流程就需要修改;

其中在锁计数+1之后也需要重置锁的有效期,避免有效期到期过期无法执行后续业务;

在这里插入图片描述

测试代码

@Resource
private RedissonClient redissonClient;
private RLock lock;
@BeforeEach
void setUp(){
	// 在每个测试方法之前执行的准备工作
    // 可以在此初始化对象、加载数据等
    lock = redissonClient.getLock("order");
}
@Test
void method1() {
    boolean isLock = lock.tryLock();
    if (!isLock) {
        System.out.println("获取锁失败。。。1");
        return;
    }
    try {
        System.out.println("获取锁成功。。。1");
        method2();
    } finally {
        System.out.println("释放锁。。。1");
        lock.unlock();
    }
}
void method2() {
    boolean isLock = lock.tryLock();
    if (!isLock) {
        System.out.println("获取锁失败。。。2");
        return;
    }
    try {
        System.out.println("获取锁成功。。。2");
    } finally {
        System.out.println("释放锁。。。2");
        lock.unlock();
    }
}

在这里插入图片描述
在这里插入图片描述

解决可重入问题的核心思想:采用hash存储的结构,去记录一个hash存储的线程以及重入的次数,通过可重入数值计数该线程下的剩余业务继续获取锁以及在何时才能释放锁。

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

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

相关文章

Windows上查看服务器上tensorboad内容

文章目录 前言一、SSH的设置二、tensorboard命令 前言 本篇文章是针对于局域网内的服务器的tensorboard可视化,由于设置方式稍微有点复杂,导致我每次隔了一段时间之后,就不知道该怎么查看tensorboard了,每次都要百度搜一大堆资料…

安达发|选择APS排程系统一定要注意这五大问题

随着信息技术的迅速发展,云计算已成为企业信息化建设的重要领域。在云计算中,aps是企业服务器环境中常见的虚拟化解决方案。然而,市场上有许多aps系统可供选择,企业在选择合适的系统时需要综合考虑多种因素。本论文将从这个五个角…

nacos十分钟快速搭建

简介 nacos是阿里巴巴开源的微服务基础组件,充当微服务架构中的配置中心和注册中心,nacos可单独作为配置中心或者注册中心 目录结构 bin,bin工具 conf,配置文件 target,nacos的jar包 安装 机器环境:cen…

清洁机器人规划控制方案

清洁机器人规划控制方案 作者联系方式Forrest709335543qq.com 文章目录 清洁机器人规划控制方案方案简介方案设计模块链路坐标变换算法框架 功能设计定点自主导航固定路线清洁区域覆盖清洁贴边沿墙清洁自主返航回充 仿真测试仿真测试准备定点自主导航测试固定路线清洁测试区域…

Redis数据类型 — Hash

目录 Hash内部实现 源码片段 Hset执行函数 创建hash对象 尝试转换存储空间的编码 遍历把键值对根据存储空间格式进行存储起来 Hash 是一个键值对(key - value)集合,Hash 特别适合用于存储对象。 Hash内部实现 Hash 类型的底层数据结构…

[Error] graphics.h: No such file or directory

原因:系统编译器找不到graphics.h文件,graphics.h这个文件就类似Java里面的jar包,也相当于Python里面pip安装的依赖包,graphics.h是样式设计文件,需要放到编译的文件夹里面 解决办法: 1.从该网址下载graphi…

Talk | 天津大学博士生赵煜:从平面图像中理解空间语义 - 视觉空间位置描述

本期为TechBeat人工智能社区第512期线上Talk! 北京时间7月12日(周三)20:00, 天津大学博士生—赵煜的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “从平面图像中理解空间语义-视觉空间位置描述”,他与大家探讨了…

Html基础知识学习——兼容问题与解决方法(十六)

文章目录 1.计算一定要精确,不要让内容的宽高超出我们设置的宽高,在IE6下内容会撑开设置好的宽高2.元素浮动,宽度需要内容撑开,就给里面的块元素都加浮动3.在ie6.ie7下元素要浮动并在同一行 就给这些元素都加浮动4.注意标签嵌套规…

数学建模-典型相关分析

上节回顾 论文:常州大学一等奖淡水养殖… 要进行 pearson 相关系数 画散点图、折线图看是否相关检验正态分布满足上述,利用pearson相关系数 刚开始推导不会没关系,会应用就行,推导过程略,之后学习了后续知识&#xff…

JS基础教程

一、JS简介 1.1 学习内容 JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。它是作为开发Web页面的脚本语言而出名,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对…

复习之系统定时任务及延迟任务

一、延迟任务(一次性的) 1. 延迟任务的设定 at 时间 :具体时间设定延迟任务 设定成功后“ ctrl d "发起任务," ctrl c " 取消。 at -l :查看延迟任务at -c 1 :查看序号为1 的延迟…

第四次CCF计算机软件能力认证

第一题:图像旋转 旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转 90 度。 计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。 输入格式 输入的第一行包含两…

MySQL(二)索引原理以及优化

MySQL系列文章 MySQL(一)基本架构、SQL语句操作、试图 MySQL(二)索引原理以及优化 MySQL(三)SQL优化、Buffer pool、Change buffer MySQL(四)事务原理及分析 MySQL(五&a…

滚珠螺杆的使用优势

滚珠螺杆主要是由螺杆、螺帽、钢珠、固定座、刮刷器以及回流管所构成的,根据循环系统的不同,还可以分为外循环式、内循环式、端塞循环式的滚珠螺杆。 滚珠螺杆发展至今,已经广泛应用到各产业机械的定位精度控制上,像精密工具机、产…

Karmada: Open, Multi-Cloud, Multi-Cluster Kubernetes Orchestration

Karmada是一个开源的多云应用编排和管理平台,旨在帮助用户在多个云提供商之间无缝地部署、编排和管理应用程序。 Karmada(Kubernetes Armada)是一个Kubernetes管理系统,它使您能够在多个Kubernetes集群和云环境中运行云原生应用程…

JavaFX 用户界面控件1——ChoiceBox ComboBox

1.选择框ChoiceBox JavaFX的ChoiceBox是一个用户界面控件,用于向用户显示一个选项列表,并允许用户从中选择一个或多个选项。下面是一个ChoiceBox的简单示例和使用介绍: 首先,导入JavaFX的相关类: import javafx.appl…

『表面』在平面模型上提取凸(凹)多边形

原始点云 直通滤波,z轴0~1.1 分割模型为平面&#xff0c;分割结果进行投影 提取多边形 代码: #include <pcl/ModelCoefficients.h> // 模型系数的数据结构&#xff0c;如平面、圆的系数 #include <pcl/io/pcd_io.h>#include <pcl/point_types.h> // 点云数据…

[SSM]Spring6基础

目录 一、Spring启示录 1.1OCP开闭原则 1.2DIP依赖倒置原则 1.3IoC控制反转 1.4DI依赖注入 二、Spring概述 2.1Spring简介 2.2Spring八大模块 2.3Spring特点 三、Spring的入门程序 3.1Spring的文件 3.2第一个Spring程序 3.3第一个Spring程序详细剖析 3.4Spring6启…

【LGR-145-Div.4】洛谷入门赛 #14(ABCDEI题解)

离开CSDN近五分之一坤年后&#xff0c;我又回归了&#xff0c;这段时间没刷题&#xff08;忙中考去了&#xff09;&#xff0c;于是乎参加了【LGR-145-Div.4】洛谷入门赛 #14&#xff0c;那才叫。。。&#xff08;这就是为什么没有FGH题解的原因&#xff09; T1 T352128 数字判…

【JavaEE】HTTPS及其安全机制

目录 1、什么是HTTPS 2、HTTPS的基本工作过程 2.1、使用对称密钥进行加密 2.2、使用非对称密钥进行加密 2.3、中间人攻击 2.4、证书 1、什么是HTTPS HTTPS是在HTTP协议的基础上引入了一个加密层&#xff08;SSL&#xff09;。HTTP协议内容都是按照文本的方式传输的&#x…