Redission分布式锁-源码解析(手把手解析)

文章目录

  • 1.关于锁的重试机制:
  • 2.锁的超时问题

1.关于锁的重试机制:

在这里插入图片描述
在这里插入图片描述
进一步进入tryLock函数内部
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.锁的超时问题

加入目前获取锁成功了,我有一个剩余的有效期,万一业务阻塞了,TTL到期了,其他线程又进来拿锁,导致线程安全问题。我必须保证我的锁是执行完业务释放的,而不是业务阻塞导致锁过期释放的,这个问题如何解决呢?
答案是有一种不断刷新任务有效期的看门狗机制,没过10秒钟自动刷新任务有效期,从而避免了业务因为线程阻塞导致锁过期自动释放,导致其他线程趁虚而入导致的线程安全问题(先说一嘴答案,免得后面看蒙蔽了,绕晕了,因为实在是很复杂!)

我们可以继续深入源码了解,首先进入上图中的tryAcquire函数中,
在这里插入图片描述
发现调用了tryAcquireAsync函数
在这里插入图片描述
又进入到tryAcquireAsync函数内部
在这里插入图片描述
进一步解释scheduleExpirationRenewal的作用
在这里插入图片描述
进一步解释EXPIRATION_RENEWAL_MAP的作用,这里的MAP是存储了entryName—>K,entry----V,这里entryName是连接名和锁名组合成的(为啥?可以看下一幅图),不同的业务组成了不同的锁名称,因此可以相当于不同业务的锁是独立的,在MAP中互不干扰。
解释一下EXPIRATION_RENEWAL_MAP.putIfAbsent的作用,就是如果MAP里面存在了这个key,我就不存他这个key了,并返回上一次这个key对应的Value,不会参数后来的val覆盖先前的val的情况,如果不存在才直接插入kv,如果这个MAP写的是put的话,在key重复插入的情况下,会导致后来的覆盖前面的val的情况。这在可重入锁中是不能发生的,因此putIfAbsent实现了帮助实现了可重入锁的功能,不管后来的锁重入几次,保证获得的都是之前的entry。并且如果这个key是新插入的话,会额外执行一个更新有效期的操作this.renewExpiration();this.renewExpiration();在下两张里面里面解释
在这里插入图片描述

在这里插入图片描述

this.renewExpiration();解释
在这里插入图片描述
renewExpiration函数内部的RFuture<Boolean> future = RedissonLock.this.renewExpirationAsync(threadId);又是一个关键的函数,又跳入renewExpirationAsync(threadId)内部一探究竟,又是一个异步刷新有效期的函数
由于这段代码在class里面写的实在是太难看了,直接copy通义灵码的分析结果,说白了,就是重置当前threadId线程持有的锁的有效期,但是你注意,这里更新完有效期之后又递归调用自己,10秒钟之后又刷新有效期。
在这里插入图片描述

在这里插入图片描述
最后这个任务的执行流程大概是这样的,等待了10秒之后执行刷新自己的任务有效期,还剩下30秒,然后过了10s之后,又递归调用自己,还剩余20s的时候再次刷新任务有效期,重复循环往返!

理解到这层意图,我们又跳回到前面的

在这里插入图片描述
那问题来了,这个任务什么时候才会释放呢?什么时候才会取消呢?
这当然是在释放锁的时候,这个任务才会被释放!
我们跳回刚开始的@Test方法里面看代码
在这里插入图片描述

进入这个指定的包里面的函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后总结第二部分的问题?如何解决的业务因为线程阻塞导致业务还没执行完就锁过期自动释放,导致其他线程趁虚而入导致的线程安全问题?通过这一段上面的源码剖析,我们知道是有一种不断刷新任务有效期的看门狗机制,没过10秒钟自动刷新任务有效期,从而避免了业务因为线程阻塞导致锁过期自动释放,导致其他线程趁虚而入导致的线程安全问题
我们在最后总结分布式锁的流程图加深印象和理解:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[数据结构] 基于交换的排序 冒泡排序快速排序

标题&#xff1a;[数据结构] 基于交换的排序 冒泡排序&&快速排序 水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 &#xff08;一&#xff09;冒泡排序 优化后实现&#xff1a; &#xff08;二&#xff09;快速排序 I、实现方法&#xff1a; &#…

移动应用开发课设——原神小助手文档(1)

2023年末&#xff0c;做的移动应用开发课设&#xff0c;分还算高&#xff0c;项目地址&#xff1a;有帮助的话&#xff0c;点个赞和星呗~ GitHub - blhqwjs/-GenShin_imp: 2023年移动应用开发课设 本文按照毕业论文要求来写&#xff0c;希望对大家有所帮助。 xxxx大学课程设计报…

一级指针 二级指针

目录 一级指针 二级指针 通过二级指针打印原数据 一级指针 一级指针就是存放变量的指针 代码演示&#xff1a; #include<stdio.h> int main() {int a 10;int* pa &a;return 0; } pa就是一级指针变量&#xff0c;是变量就会有地址&#xff0c;因为变量都是在…

警惕AI泡沫:巨额投资与回报失衡

尽管高科技巨头们在AI基础设施上投入巨资&#xff0c;但AI带来的收入增长尚未显现&#xff0c;揭示了生态系统末端用户价值的重大缺口。 红杉资本分析师David Cahn认为&#xff0c;AI企业需每年赚取约6000亿美元才能抵消其AI基础设施&#xff08;如数据中心&#xff09;的成本&…

Docker部署Seata与Nacos整合

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Docker部署Seata与Nacos整合 Docker 部署 Seata 与 Nacos 整合 运行所使用的 demo项目地址 …

测试环境:使用OpenSSL生成证书并配置Https

文章目录 需求1、安装OpenSSL1.1、安装包下载1.2、安装&#xff08;以window 64位为例&#xff09;1.3、配置环境变量&#xff08;非必须&#xff09; 2、生成证书2.1、新建文件夹2.2、生成根证书2.2.1、生成私钥2.2.2、生成根证书&#xff0c;并且自签名 2.3、服务端证书生成2…

自然之美无需雕琢

《自然之美&#xff0c;无需雕琢 ”》在这个颜值至上的时代&#xff0c;但在温馨氛围中&#xff0c;单依纯以一种意想不到的方式&#xff0c;为我们诠释了自然之美的真谛。而医生的回答&#xff0c;如同一股清流耳目一新。“我说医生你看我这张脸&#xff0c;有没有哪里要动的。…

论文回顾 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法

论文速览 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法 1 引言 在计算机视觉和机器人领域,相机校准一直是一个基础而又重要的问题。传统的相机校准方法主要依赖于从已知校准图案中提取角点,然后通过优化算法求解相机的内参和外参。这…

绝区叁--如何在移动设备上本地运行LLM

随着大型语言模型 (LLM)&#xff08;例如Llama 2和Llama 3&#xff09;不断突破人工智能的界限&#xff0c;它们正在改变我们与周围技术的互动方式。这些模型早已集成到我们的手机中&#xff0c;但到目前为止&#xff0c;它们理解和处理请求的能力还非常有限。然而&#xff0c;…

认识并理解webSocket

今天逛牛客&#xff0c;看到有大佬分享说前端面试的时候遇到了关于webSocket的问题&#xff0c;一看自己都没见过这个知识点&#xff0c;赶紧学习一下&#xff0c;在此记录&#xff01; WebSocket 是一种网络通信协议&#xff0c;提供了全双工通信渠道&#xff0c;即客户端和服…

TeXstudio对已加载宏包的命令标记为暗红色未知命令

宏包已正常加载&#xff0c;编译也正常&#xff0c;但却将某些命令标记为暗红色。 具体的原因可参考 https://sourceforge.net/p/texstudio/wiki/Frequently%20Asked%20Questions/#how-does-txs-know-about-valid-commandshttps://sourceforge.net/p/texstudio/wiki/Frequent…

非对称加密算法原理与应用2——RSA私钥加密文件

作者:私语茶馆 1.相关章节 (1)非对称加密算法原理与应用1——秘钥的生成-CSDN博客 第一章节讲述的是创建秘钥对,并将公钥和私钥导出为文件格式存储。 本章节继续讲如何利用私钥加密内容,包括从密钥库或文件中读取私钥,并用RSA算法加密文件和String。 2.私钥加密的概述…

【HICE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通

Micron近期发布了32Gb DDR5 DRAM

Micron Technology近期发布了一项内存技术的重大突破——一款32Gb DDR5 DRAM芯片&#xff0c;这项创新不仅将存储容量翻倍&#xff0c;还显著提升了针对人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、高性能计算&#xff08;HPC&#xff09;以及数…

转发服务器实验

首先先克隆一个虚拟机并完成ip地址的修改 nmcli connection modify ens160 ipv4.addresses 192.168.209.128/24 nmcli connection modify ens160 ipv4.method manual nmcli connection modify ens160 connection.autoconnect yes nmcli connection up ens160 nmcli connection…

基于深度学习LightWeight的人体姿态检测跌倒系统源码

一. LightWeight概述 light weight openpose是openpose的简化版本&#xff0c;使用了openpose的大体流程。 Light weight openpose和openpose的区别是&#xff1a; a 前者使用的是Mobilenet V1&#xff08;到conv5_5&#xff09;&#xff0c;后者使用的是Vgg19&#xff08;前10…

昇思25天学习打卡营第11天|MindSpore 助力下的 GPT2:数据集加载处理及模型全攻略

目录 环境配置 数据集下载和获取 数据集拆分 处理数据集 模型构建 ​​​​​​​模型训练 ​​​​​​​模型推理 环境配置 “%%capture captured_output”这一行指令通常旨在捕获后续整个代码块所产生的输出结果。首先&#xff0c;将已预装的 mindspore 库予以卸载。随后&a…

2024年AI技术深入研究

2024年AI技术持续快速发展,应用领域广泛,产业发展迅速,市场趋势积极,学术研究深入。 AI技术进展大模型发展 2024年,智谱AI正在研发对标OpenAI Sora的高质量文生视频模型,预计最快年内发布。智谱AI的进展显示了国内AI大模型领域的快速发展,以及与国际领先技术的竞争态势…

Ubuntu20.04突然没网的一种解决办法

本来要学一下点云地图处理&#xff0c;用octomap库&#xff0c;但是提示少了octomap-server库&#xff0c;然后通过下面命令安装的时候&#xff1a; sudo apt install ros-noetic-octomap-server 提示&#xff1a;错误:7 https://mirrors.ustc.edu.cn/ubuntu focal-security …

jni原理和实现

一、jni原理 主要就是通过数据类型签名和反射来实现java与c/c方法进行交互的 数据类型签名对应表 javac/cbooleanZbyteBcharCshortSintIlongLfloatFdoubleDvoidVobjectL开头&#xff0c;然后以/分割包的完整类型&#xff0c;后面再加; 比如String的签名就是Ljava/long/Strin…