SpringCloud 分布式锁Redisson锁的重入性与看门狗机制 高并发 可重入
可重入
Redisson 的锁支持 可重入性,这意味着同一个线程在获取锁后,如果再次尝试获取该锁,它可以成功地获得锁,而不会被阻塞。
- 每次一个线程成功获取锁后,它的持有次数会增加。当线程再次获取该锁时,Redisson 会检查该线程是否已经持有锁。如果是,它会允许该线程再次获取锁,并将持有次数递增。
- 每次释放锁时,持有次数会递减,直到持有次数变为零,锁才会被完全释放。
public static void main(String[] args) {// 创建 Redisson 客户端配置Config config = new Config();config.useSingleServer().setAddress("redis://localhost:6379"); // 连接到本地 Redis 服务器RedissonClient redisson = Redisson.create(config);// 获取分布式锁RLock lock = redisson.getLock("accountLock");try {// 模拟账户操作的过程:先获取锁,进行第一次操作lock.lock(); //+1System.out.println("Lock acquired for the first time!");// 业务逻辑:扣款deductBalance(lock);} finally {// 释放锁:必须要释放与 lock.lock() 相同次数的 unlock() 才能完全释放锁lock.unlock(); //-1System.out.println("Lock released after first operation.");}}// 模拟业务逻辑:扣款操作private static void deductBalance(RLock lock) {// 业务逻辑需要在同一个线程中再次获取锁(模拟可重入性)lock.lock();//+1try {System.out.println("Lock acquired for the second time, performing deduct balance operation...");// 扣款逻辑,比如账户余额减少System.out.println("Balance deducted!");} finally {// 释放锁lock.unlock();//-1System.out.println("Lock released after deduct balance operation.");}}
当value值为0时就会释放锁。
这就是锁的可重入性。
看门狗机制
看门狗机制用于确保分布式系统中,锁或资源的持有者在预定时间内释放锁,否则看门狗会自动释放该锁,避免死锁等问题。帮助避免因某些异常(如程序崩溃或线程挂起)而导致锁被永久占用。
-
自动续期:定期地自动刷新锁的过期时间。当锁被一个线程或进程持有时,会定期更新锁的 TTL(过期时间),以防止它被过期。即使持锁者在持有锁的过程中没有显式地释放锁,会确保锁不会在持有者不主动释放时过期,从而避免因过期造成的错误。
-
自动解锁:如果持锁者超时或出现故障,会在检测到持锁者没有继续更新锁的超时时间后,自动释放锁,避免死锁。
-
配置超时时间:可以与锁的过期时间和续期机制结合使用,可以通过配置来指定超时时间和自动续期的时间间隔。
相关源代码
尝试获取锁,如果不能获取锁,一直等待直到获取成功或者达到超时限制。中间部分涉及到锁的租期和超时处理,保证锁的可用性和避免死锁。interruptibly 参数提供了是否支持中断等待的选项。
private void lock(long leaseTime, TimeUnit unit, boolean interruptibly) throws InterruptedException {// 获取当前线程的ID,用于标识是哪一个线程请求锁long threadId = Thread.currentThread().getId();// 尝试获取锁,并获得锁的剩余有效时间 ttlLong ttl = this.tryAcquire(-1L, leaseTime, unit, threadId);// 如果成功获得锁(ttl != null),则进入锁处理逻辑if (ttl != null) {// 订阅当前线程的锁操作,返回一个 RFuture 对象,用于后续的异步操作RFuture<RedissonLockEntry> future = this.subscribe(threadId);// 根据 interruptibly 参数决定同步执行订阅操作if (interruptibly) {// 如果需要响应中断,使用带中断支持的同步方法this.commandExecutor.syncSubscriptionInterrupted(future);} else {// 如果不需要响应中断,直接使用同步方法this.commandExecutor.syncSubscription(future);}try {// 启动一个无限循环来持续尝试获取锁while (true) {// 每次进入循环时,重新尝试获取锁的剩余时间 ttlttl = this.tryAcquire(-1L, leaseTime, unit, threadId);// 如果 ttl 为 null,表示锁已经过期或无法获取,跳出循环if (ttl == null) {return;}// 如果 ttl >= 0L,表示可以继续持有锁if (ttl >= 0L) {try {// 尝试在 ttl 指定的时间内获取 latch((RedissonLockEntry) future.getNow()).getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);} catch (InterruptedException var13) {// 如果在获取 latch 时发生 InterruptedException,则根据 interruptibly 变量决定是否抛出异常if (interruptibly) {// 如果需要响应中断,抛出 InterruptedExceptionthrow var13;}// 如果不需要响应中断,尝试继续获取 latch((RedissonLockEntry) future.getNow()).getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);}} else if (interruptibly) {// 如果 ttl 为负值并且需要响应中断,调用 acquire 方法阻塞直到获取锁((RedissonLockEntry) future.getNow()).getLatch().acquire();} else {// 如果 ttl 为负值并且不需要响应中断,调用 acquireUninterruptibly 方法阻塞直到获取锁((RedissonLockEntry) future.getNow()).getLatch().acquireUninterruptibly();}}} finally {// 最终,取消订阅,释放资源this.unsubscribe(future, threadId);}}
}
- 自动续期:通过 ttl 值和 latch.tryAcquire 方法,锁的超时时间会在持有锁的线程未释放锁的情况下自动延长,避免锁超时。
- 避免死锁:如果线程因为异常等原因没有释放锁,看门狗机制会确保锁最终被释放。
相关文章:

SpringCloud 分布式锁Redisson锁的重入性与看门狗机制 高并发 可重入
可重入 Redisson 的锁支持 可重入性,这意味着同一个线程在获取锁后,如果再次尝试获取该锁,它可以成功地获得锁,而不会被阻塞。 每次一个线程成功获取锁后,它的持有次数会增加。当线程再次获取该锁时,Redi…...

02 APP 自动化-Appium 运行原理详解
环境搭建见 01 APP 自动化-环境搭建 文章目录 一、Appium及Appium自动化测试原理二、Appium 自动化配置项三、常见 ADB 命令四、第一个 app 自动化脚本 一、Appium及Appium自动化测试原理 Appium 跨平台、开源的 app 自动化测试框架,用来测试 app 应用程序&#x…...

由docker引入架构简单展开说说技术栈学习之路
想象一下,你开了一家线上小卖部(单机版),突然爆单了怎么办?别急,技术架构的升级打怪之路,可比哆啦A梦的口袋还神奇! 第1关:单枪匹马的创业初期(单机架构&…...

linux 1.0.5
环境变量到底是什么 也就是windows上面的环境变量 就是这个东东,用户变量和系统变量,那这些到底是啥呢? 主包只是用过,配置来配置去的,就是不知道是啥意思 windows上面的环境变量 windows的ls命令是dir 输入calc可有…...

强化学习的前世今生(五)— SAC算法
书接前四篇 强化学习的前世今生(一) 强化学习的前世今生(二) 强化学习的前世今生(三)— PPO算法 强化学习的前世今生(四)— DDPG算法 本文为大家介绍SAC算法 7 SAC 7.1 最大熵强化…...
SQL进阶之旅 Day 8:窗口函数实用技巧
【SQL进阶之旅 Day 8】窗口函数实用技巧 在现代数据库开发中,处理复杂的业务逻辑和大规模数据时,仅仅依靠传统的GROUP BY和JOIN操作已经无法满足需求。**窗口函数(Window Function)**作为SQL标准的一部分,为开发者提供…...

生成对抗网络(GAN)基础原理深度解析:从直观理解到形式化表达
摘要 本文详细解析 生成对抗网络(GAN) 的 核心原理,从通俗类比入手,结合印假钞与警察博弈的案例阐述生成器 与 判别器 的对抗机制;通过模型结构示意图,解析 噪声采样、样本生成 及判别流程;基于…...
ubuntu 安装redis-6.2.9 源码安装和相关配置详解
目录 1 查看redis 软件列表 2 操作系统信息 3 redis软件下载并编译安装 4 redis 配置文件 5 启动redis 6 redis登录测试 7 设置redis开机启动 8 redis 配置详解 1 查看redis 软件列表 https://download.redis.io/releases/ 2 操作系统信息 rootu24-redis-120:~# cat /…...
c++之数组
目录 C数组基础概念 数组常见操作 二维数组定义与初始化 二维数组遍历方法 二维数组与函数 C数组基础概念 数组是C中用于存储相同类型元素的连续内存结构。通过索引访问元素,索引从0开始。数组大小必须在编译时确定,属于静态数据结构。 #include &…...
torch.distributed.launch 、 torchrun 和 torch.distributed.run 无法与 nohup 兼容
问题现象: 使用nohup 启动torch的分布式训练后, 由于ssh断开与服务器的连接, 导致训练过程出错: WARNING:torch.distributed.elastic.agent.server.api:Received 1 death signal, shutting down workers WARNING:torch.distribu…...
[SC]C++ 中 struct vs. class 的唯一区别
SystemC中 struct vs. class 的唯一区别 一、背景: 在 SystemC 示例里你会常看到这样的写法:SC_MODULE(Top) {// … ports, signals, 进程注册 … };而如果你展开宏 SC_MODULE(Top),它本质上就是:struct Top : sc_core::sc_module {// public:// Top(sc_core::sc_module_…...
React从基础入门到高级实战:React 高级主题 - React设计模式:提升代码架构的艺术
React设计模式:提升代码架构的艺术 引言 在React开发中,设计模式是构建可维护、可扩展和高性能应用的关键。随着应用复杂性的增加,掌握高级设计模式不仅是技术上的挑战,更是打造优雅架构的艺术。对于有经验的开发者而言…...

【GitHub开源AI精选】WhisperX:70倍实时语音转录、革命性词级时间戳与多说话人分离技术
系列篇章💥 No.文章1【GitHub开源AI精选】LLM 驱动的影视解说工具:Narrato AI 一站式高效创作实践2【GitHub开源AI精选】德国比勒费尔德大学TryOffDiff——高保真服装重建的虚拟试穿技术新突破3【GitHub开源AI精选】哈工大(深圳)…...
【leetcode】459.重复的子字符串
文章目录 题目题解枚举 题目 459.重复的子字符串 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “aba” 输出: false 示例 3: 输入…...

华为OD机试真题——文件目录大小(2025 A卷:100分)Java/python/JavaScript/C++/C语言/GO六种语言最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 2025华为OD真题目录+全流程解析/备考攻略/经验分享 华为OD机试真题《文件目录大小》: 目录 题…...
【Java】mybatis-plus乐观锁与Spring重试机制
上一篇【Java】mybatis-plus乐观锁-基本使用 讲到了mybatis-plus的基本使用,简单的使用Version和一个基础配置类即可实现乐观锁。 但是mybatis-plus本身并没有自带重试机制。 即当我们带上版本号去更新数据,但是由于另一个线程已经将版本号修改了&#x…...
Linux 与 Windows:哪个操作系统适合你?
Linux vs Windows:系统选择的关键考量 在数字化转型浪潮中,操作系统作为底层基础设施的重要性日益凸显。Linux与Windows作为主流选择,其差异不仅体现在技术架构上,更深刻影响着开发效率、运维成本与安全性。本文将从7个核心维度展开对比分析,并提供典型应用场景建…...
C#委托的概念与使用方法
一、委托的基本概念 委托是一种引用类型,它允许将方法作为参数进行传递。简单来说,委托就像是对方法的引用,可以通过委托来调用对应的方法。 委托具有类型安全性,它会检查方法的签名是否与委托的签名匹配,这有助于避免…...

消费者行为变革下开源AI智能名片与链动2+1模式S2B2C商城小程序的协同创新路径
摘要:在信息爆炸与消费理性化趋势下,消费者从被动接受转向主动筛选,企业营销模式面临重构挑战。本文提出开源AI智能名片与链动21模式S2B2C商城小程序的协同创新框架,通过AI驱动的精准触达、链动裂变机制与S2B2C生态赋能࿰…...

软考 系统架构设计师系列知识点之杂项集萃(78)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(77) 第139题 以下关于软件测试工具的叙述,错误的是()。 A. 静态测试工具可用于对软件需求、结构设计、详细设计和代码进行评审、走查和审查 B. 静…...
解决MyBatis参数绑定中参数名不一致导致的错误问题
前言 作为一名Java开发者,我在实际项目中曾多次遇到MyBatis参数绑定的问题。其中最常见的一种情况是:在Mapper接口中定义的参数名与XML映射文件中的占位符名称不一致,导致运行时抛出Parameter xxx not found类异常。这类问题看似简单&#x…...

如何解决MySQL Workbench中的错误Error Code: 1175
错误描述: 在MySQL Workbench8.0中练习SQL语句时,执行一条update语句,总是提示如下错误: Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnTo disab…...

Docker 镜像(或 Docker 容器)中查找文件命令
在 Docker 镜像(或 Docker 容器)中运行如下两个命令时: cd / find . -name generate.py它们的含义如下,我们来一行一行详细拆解,并结合例子讲解: ✅ 第一行:cd / ✅ 含义 cd 是“change dire…...

MySQL进阶篇(存储引擎、索引、视图、SQL性能优化、存储过程、触发器、锁)
MySQL进阶篇 存储引擎篇MySQL体系结构存储引擎简介常用存储引擎简介存储引擎的选择 索引篇索引简介索引结构(1)BTree索引(2)hash索引 索引分类索引语法SQL性能分析指标(1)SQL执行频率(2)慢查询日志(3)profile详情(4)explain或desc执行计划 索引使用引起索引的失效行为SQL提示覆…...
python批量解析提取word内容到excel
# 基于Python实现Word文档内容批量提取与Excel自动化存储 ## 引言 在日常办公场景中,常需要从大量Word文档中提取结构化数据并整理到Excel表格中。传统手动操作效率低下,本文介绍如何通过Python实现自动化批处理,使用python-docx和openpyxl…...

BugKu Web渗透之game1
启动场景,打开网页如下: 是一个游戏。 步骤一: 右键查看源代码也没有发现异常。 步骤二: 点击开始游戏来看看。 结果他是这种搭高楼的游戏。我玩了一下子,玩到350分就game over。 之后就显示游戏结束,如…...
使用Composer创建公共类库
概述 如果多个项目中存在使用相同类库、模块的情况,此时可以考虑将类库或者模块单独抽取出来,形成独立类库,通过composer 来进行依赖管理,这样可以更方便维护,大大提升开发效率。 优势 可以对特定模块进行统一维护和…...

Axure设计案例——科技感渐变柱状图
想让你的数据展示瞬间脱颖而出,成为众人瞩目的焦点吗?快来看看这个 Axure 设计的科技感渐变柱状图案例!科技感设计风格以炫酷的渐变色彩打破传统柱状图的单调,营造出一种令人惊叹的视觉盛宴。每一个柱状体都仿佛蕴含着无限能量&am…...
LeetCode 热题 100 394. 字符串解码
LeetCode 热题 100 | 394. 字符串解码 大家好!今天我们来探讨一道非常有趣的算法题目——LeetCode 394. 字符串解码。这道题考察了我们对栈这种数据结构的理解和应用能力,同时也涉及到了字符串的处理技巧。接下来,我将详细地为大家解析这道题…...

互联网大厂智能体平台体验笔记字节扣子罗盘、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台
互联网大厂 字节扣子、阿里云百炼、百度千帆 、腾讯元器、TI-ONE平台、云智能体开发平台 体验 开始动手 了解 智能体,发现已经落后时代太远 光头部互联网大厂对开 公开的平台就已经这么多,可以学习和了解,相关的信息 整理了对应的平台地址…...