Redission 解锁异常:attempt to unlock lock, not locked by current thread by node id
标题:解锁异常:Redission中的"attempt to unlock lock, not locked by current thread by node id"问题分析与解决方案
在分布式系统中,锁是常用的同步机制,用于保护共享资源,避免并发冲突。Redission是一个流行的分布式锁框架,但有时候在使用过程中,我们可能会遇到一个异常,即:“attempt to unlock lock, not locked by current thread by node id”。这个异常提示我们尝试解锁一个没有被当前线程锁定的锁,可能会让人感到困惑。本文将详细分析这个异常出现的原因,并提供解决方案,帮助大家更好地使用Redission。
异常出现的原因
这个异常通常出现在以下情况下:
-
锁被其他线程或节点锁定:当一个线程或节点已经获得了该锁,而另一个线程或节点尝试解锁时,就会出现这个异常。这是Redission为了确保解锁的安全性而做的检查。
-
锁超时:如果锁设置了超时时间,在超时后尝试解锁也会引发这个异常。这是因为锁超时后会自动释放,如果已经超时,就不应再手动解锁。
解决方案
针对这个异常,我们可以采取以下措施来解决:
-
确保锁是由当前线程或节点获得的:在解锁之前,我们需要确保当前线程或节点已经获得了该锁。可以在解锁前使用
isLocked()方法来检查锁的状态,确保只有获得锁的线程或节点才能解锁。 -
避免重复解锁:如果锁已经超时自动释放,就不需要再手动解锁。我们可以在解锁前使用
isHeldByCurrentThread()方法来检查当前线程是否持有该锁,避免重复解锁。
下面是一个示例代码,演示了如何使用Redission锁并避免出现"attempt to unlock lock, not locked by current thread by node id"异常:
RLock lock = redissonClient.getLock(SHUI_WEN_ST_PPTN_R_QUEUE);
try {// 尝试获取锁,等待10秒,锁自动释放时间为30秒boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS);if (isLocked) {// 执行需要保护的代码} else {// 未获得锁,处理锁定失败的情况log.info("获取redisson锁失败");}
} catch (InterruptedException e) {// 处理中断异常
} finally {// 解锁前检查当前线程是否持有该锁if (lock != null && lock.isHeldByCurrentThread()) {lock.unlock();}
}
通过以上的解决方案,我们可以避免"attempt to unlock lock, not locked by current thread by node id"异常的出现,保证在使用Redission分布式锁时的稳定性和正确性。
总之,当我们在使用Redission分布式锁时,遇到解锁异常时,可以考虑以上的原因和解决方案,以确保我们的分布式锁机制能够正常运行,保护共享资源的安全性。
相关文章:
Redission 解锁异常:attempt to unlock lock, not locked by current thread by node id
标题:解锁异常:Redission中的"attempt to unlock lock, not locked by current thread by node id"问题分析与解决方案 在分布式系统中,锁是常用的同步机制,用于保护共享资源,避免并发冲突。Redission是一个…...
AIGC技术揭秘:探索火热背后的原因与案例
文章目录 什么是AIGC技术?为何AIGC技术如此火热?1. 提高效率与创造力的完美结合2. 拓展应用领域,创造商业价值3. 推动技术创新和发展 AIGC技术案例解析1. 艺术创作:生成独特的艺术作品2. 内容创作:实时生成各类内容3. …...
【Linux】总结1-命令工具
文章目录 基础指令shell命令以及运行原理Linux权限粘滞位工具 基础指令 ls、pwd、touch、mkdir、netstat、cp、mv、cd、tar、zip、unzip、grep、pstack、ps、rm、cat、more、less、head、tail、find、ulimit -a、clear、whoami、man touch:创建文件,也包…...
Git远程仓库
Git远程仓库 推送拉取git fetchgit pull 克隆 推送 Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。那要怎么实现这种分布呢?我们可以找一台电脑充当服务器,也就是扮演远程仓库的角色,一直都处于开机…...
Redis缓存设计
缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。但是将缓存加入应用架构后也会带来一些问题,本文将针对这些问题介绍缓存使用技巧和设计方案。 1缓存的收益和成本 下图左侧为客户端直接调用存储层的架…...
华熙生物肌活:2023年版Bio-MESO肌活油性皮肤科学护肤指南
关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 以悦己和尝鲜为消费动机的他们,已迅速崛起成为护肤行业的焦点人群。而在新生代护肤议题中,“油性皮肤护理”已经成为一个至关重要的子集。今天,中国新生代人口数量…...
mysql索引介绍
索引可以提升查询速度,会影响where查询,以及order by排序。MySQL索引类型如下: 从索引存储结构划分:B Tree索引、Hash索引、全文索引 从应用层次划分:主键索引、唯一索引、单值索引、复合索引 从索引键值类型划分&am…...
说一下什么是tcp的2MSL,为什么客户端在 TIME-WAIT 状态必须等待 2MSL 的时间?
1.TCP之2MSL 1.1 MSL MSL:Maximum Segment Lifetime报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间 1.2为什么存在MSL TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段,并且TTL的限制是基于跳数 1.3…...
更新spring boot jar包中的BOOT-INF/lib目录下的jar包
更新spring-boot jar包中的BOOT-INF/lib目录下的jar包 场景 需要更新lib目录下某个jar包的配置文件 失败的解决方法 用解压软件依次打开spring-boot jar包(设为a.jar)、BOOT-INF/lib目录下的jar包(设为b.jar),然后修改…...
纯前端 -- html转pdf插件总结
一、html2canvasjsPDF(文字会被截断): 将HTML元素呈现给添加到PDF中的画布对象,不能仅使用jsPDF,需要html2canvas或rasterizeHTML html2canvasjsPDF的具体使用链接 二、html2pdf(内容显示不全文字会被截断…...
数据结构和算法基础
巩固基础,砥砺前行 。 只有不断重复,才能做到超越自己。 能坚持把简单的事情做到极致,也是不容易的。 数据结构和算法 程序 数据结构算法 数据结构是算法的基础 问题1:字符串匹配问题。str1 是否完全包含 str2 1)暴…...
JS二维数组转化为对象
将二维数组转化为对象的形式 转之前的数据: 转之后: const entries new Map([[foo, bar],[baz, 42],[beginNode, 202212151048010054],[beginNode, 202212151048447710],]); console.log(entries)const obj Object.fromEntries(entries);console.lo…...
通过 EPOLL 解决客户端同时连接多服务器的问题
项目需求是 程序上 同时配置了多个服务端 设备 每隔一段时间需要 比如1分钟 连一下服务器看下是否连通 并将结果上报给平台 原来是用线程池来做的 具体大概就是 定时器到了之后 遍历设备列表 找到设备之后 通过 socket连接 发送一个指令 等待服务器返回 用来检查是…...
JavaScript数据结构【进阶】
注:最后有面试挑战,看看自己掌握了吗 文章目录 使用 splice() 添加元素使用 slice() 复制数组元素使用展开运算符复制数组使用展开运算符合并数组使用 indexOf() 检查元素是否存在使用 for 循环遍历数组中的全部元素创建复杂的多维数组将键值对添加到对象…...
jQuery编程学习3(jQuery 其他方法: jQuery 拷贝对象、 jQuery 多库共存、jQuery 插件)
目录 jQuery 其他方法 1. jQuery 拷贝对象 $.extend()方法 2. jQuery 多库共存 问题概述: 客观需求: jQuery 解决方案:(两种方式) 3. jQuery 插件 jQuery 插件常用的网站: jQuery 插件使用步骤&…...
jvm——垃圾回收机制(GC)详解
开始之前有几个GC的基本问题 什么是GC? GC 是 garbage collection 的缩写,意思是垃圾回收——把内存(特别是堆内存)中不再使用的空间释放掉;清理不再使用的对象。 为什么要GC? 堆内存是各个线程共享的空间…...
计算机组成原理-笔记-第七章
目录 七、第七章——输入输出系统 1、IO设备与IO控制方式 (1)控制方式(查询,中断,DMA) (2)通道控制 (3)IO系统 (4)总结 2、外设…...
【Linux】网络基础2
文章目录 网络基础21. 应用层1.1 协议1.2 HTTP 协议1.2.1 URL1.2.2 urlencode和urldecode1.2.3 HTTP协议格式1.2.4 HTTP的方法1.2.5 HTTP的状态码1.2.6 HTTP 常见的header1.2.7 最简单的HTTP服务器 2. 传输层2.1 端口号2.1.1 端口号范围划分2.1.2 认识知名端口号2.1.3 netstat2…...
可视化绘图技巧100篇进阶篇(四)-三维簇状柱形图(3D Clustered Bar Chart)
目录 前言 适用场景 图例 柱形图 一、柱形图的特点 二、柱形图的类型...
架构设计第八讲:架构 - 理解架构的模式2 (重点)
架构设计第八讲:架构 - 理解架构的模式2 (重点) 本文是架构设计第8讲:架构 - 理解架构的模式2,整理自朱晔的互联网架构实践心得, 他是结合了 微软给出的云架构的一些模式的基础上加入他自己的理解来总结互联网架构中具体的一些模式。我在此基…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
