分布式锁代码编写问题分析

news/2025/3/10 14:52:02/文章来源:https://www.cnblogs.com/liran123/p/18610847

 

先给大家一段代码示例:

    @AutowiredRedisson  redisson;@GetMapping("/modifyInfo/{id}")public Result modifyInfo(@PathVariable String id) {String lockKey = RedisLockConstant.ERP_CLUE_LOCK + id;RLock rLock = redisson.getLock(lockKey);try {rLock.tryLock(15,10, TimeUnit.SECONDS);doSomething(id);} catch (InterruptedException e) {log.error("加锁失败",e);return Result.error("网络拥堵请稍后再试", null);} finally {rLock.unlock();}return Result.success();}private void doSomething(String id) {log.info("业务请求- start -- {},{}",id,Thread.currentThread().getName());try {Thread.sleep(6000);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info("业务请求-end - {},{}",id,Thread.currentThread().getName());}
 问题点分析:  
rLock.tryLock(15,10, TimeUnit.SECONDS);
先说tryLock三个参数的含义:

 

接着分析:
rLock.tryLock(100,10, TimeUnit.SECONDS);

设置等待时间100S ,如果6个请求同时过来了,看起来没问题,日志显示排队执行的。

2024-12-16 17:34:28.868 INFO [TID: N/A] http-nio-9115-exec-2 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求- start -- 11,http-nio-9115-exec-2
2024-12-16 17:34:34.868 INFO [TID: N/A] http-nio-9115-exec-2 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求-end - 11,http-nio-9115-exec-2
2024-12-16 17:34:34.880 INFO [TID: N/A] http-nio-9115-exec-1 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求- start -- 11,http-nio-9115-exec-1
2024-12-16 17:34:40.881 INFO [TID: N/A] http-nio-9115-exec-1 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求-end - 11,http-nio-9115-exec-1
2024-12-16 17:34:40.890 INFO [TID: N/A] http-nio-9115-exec-9 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求- start -- 11,http-nio-9115-exec-9
2024-12-16 17:34:46.891 INFO [TID: N/A] http-nio-9115-exec-9 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求-end - 11,http-nio-9115-exec-9
2024-12-16 17:34:46.905 INFO [TID: N/A] http-nio-9115-exec-3 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求- start -- 11,http-nio-9115-exec-3
2024-12-16 17:34:52.905 INFO [TID: N/A] http-nio-9115-exec-3 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求-end - 11,http-nio-9115-exec-3
2024-12-16 17:34:52.910 INFO [TID: N/A] http-nio-9115-exec-6 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求- start -- 11,http-nio-9115-exec-6
2024-12-16 17:34:58.910 INFO [TID: N/A] http-nio-9115-exec-6 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求-end - 11,http-nio-9115-exec-6
2024-12-16 17:34:58.927 INFO [TID: N/A] http-nio-9115-exec-4 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求- start -- 11,http-nio-9115-exec-4
2024-12-16 17:35:04.928 INFO [TID: N/A] http-nio-9115-exec-4 com.alpha.erp.controller.accounts.SupplierAccountsController - 业务请求-end - 11,http-nio-9115-exec-4

 

可以理解为,每个线程都是进来最大等待100S,执行过程中,每个线程都没超过最大时间,都很文明的在等待;

如果我们把最大等待时间调整后继续测试,还是6个请求:

rLock.tryLock(15,10, TimeUnit.SECONDS);

 

上面有三个请求已经超过最大等待时间了,3个请求排队了,另外3个最大时间已过,15S后,这3个一起不文明的进来了。同时还出现了锁的释放也乱了,出现了异常;

总结:可以理解为,最大等待时间就是并发的每个线程,最大的文明时间。如果阻塞的请求过多,排队执行的时间累加起来超过最大等待时间,那继续排队的那些线程就开始不文明了。同时涌入,也就是不可控了

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AlmaLinux 10.0 Beta “Purple Lion” - RHEL 二进制兼容免费发行版

AlmaLinux 10.0 Beta “Purple Lion” - RHEL 二进制兼容免费发行版AlmaLinux 10.0 Beta “Purple Lion” - RHEL 二进制兼容免费发行版 由社区提供的免费 Linux 操作系统,RHEL 二进制兼容发行版 请访问原文链接:https://sysin.org/blog/almalinux-10/ 查看最新版。原创作品,…

leetcode2055. 蜡烛之间的盘子 - 前缀和

这道题目作为比较单纯的前缀和题目,不需要额外的一些知识,只需要了解前缀和数组的生成与使用即可,并且也有一定的难度(难度分1819),是一个比较好的前缀和例题。 题干 算术评级: 6第 64 场双周赛Q3 给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符…

云原生周刊:Kubernetes v1.32 正式发布

云原生周刊:Kubernetes v1.32 正式发布 开源项目推荐 Helmper Helmper 简化了将 Helm Charts导入OCI(开放容器倡议)注册表的过程,并支持可选的漏洞修复功能。它确保您的 Helm Charts不仅安全存储,还能及时应用最新的安全修复。该工具完全兼容 OCI 标准,能够方便地与 OCI …

五款实用报表工具推荐:助你轻松搞定数据可视化!

概述 本文将为大家介绍五款功能各异的报表工具,包括山海鲸报表、Canva、BIRT、Chart.js和Metabase。文章详细分析了每款工具的特点、优缺点以及适用场景,帮助企业用户根据自身需求选择合适的报表解决方案,以提高数据分析和可视化能力。 1. 山海鲸报表 简介山海鲸报表是一款国…

三、USB PD物理层

1、定义 物理层(PHY层)定义了USB电源传输的信令技术。本章定义了USB PD设备之间的互操作性所需的PD物理层的电气要求和参数。 2、物理层的功能 USB PD物理层由一对发射机和接收器组成,它们通过单个信号线(CC)进行通信。所有的通信都是半双工的。PHY层实现了避免冲突,以最小…

FineReport模板性能问题排查方法

1. 概述 模板的加载速度受到很多因素影响,如果一个模板预览的时候,加载较慢,该如何去分析问题原因呢? 2. 排查步骤 2.1 查看数据集查询速度 大部分模板加载慢,都是因为 sql 执行速度比较慢。那么如何验证 sql 速度快慢呢?可以使用以下几种方案。 1)在设计器的数据集中直…

模板性能问题排查方法

1. 概述 模板的加载速度受到很多因素影响,如果一个模板预览的时候,加载较慢,该如何去分析问题原因呢? 2. 排查步骤 2.1 查看数据集查询速度 大部分模板加载慢,都是因为 sql 执行速度比较慢。那么如何验证 sql 速度快慢呢?可以使用以下几种方案。 1)在设计器的数据集中直…

【bug】重复请求的幂等问题

问题背景 某验收系统,客户发起验收流程时,由于前端没有做防重点击的限制,导致申请按钮连续点击了多次,重复发起了多条流程 历史逻辑 后端为了保证接口幂等,在发起验收流程的代码中加了几层逻辑如下:判断验收记录状态是否为待发起, 如果不是,则立刻返回失败 发起流程的入…

Deformable DETR

PDF:https://arxiv.org/pdf/2010.04159 Code:https://github.com/fundamentalvision/Deformable-DETR 一、大体内容 前面介绍DETR时,说明了其还存在对小物体检测效果不佳和训练慢的问题,Deformable DETR引入了DCN(Deformable Convolutional Networks)并将其和DETR相结合,借…

【蓝队】HW中盛行的Java内存马,如何全面检测?

一、背景 1.1 Java内存马是什么? 内存马是一种仅在内存中运行、没有文件落地的恶意程序,因此具有较强的隐蔽性,能够避开常规的基于文件系统的检测。Java内存马是针对Java语言的内存马,它利用Java语言的动态特性,如类加载机制、动态代理和反射技术等,在Java应用的内存中注…

Express的使用笔记9 使用bcrypt算法给用户密码加密

先了解一下bcrypt算法,一种基于Blowfish密码学算法的密码散列函数,用于在密码存储时抵抗暴力破解攻击,通过在散列过程中加salt来提高安全性,salt是个随机生成的数据串,与密码一起被散列,使得即使两个相同的密码也会产生不同的散列值。bcrypt算法允许开发者指定工作因子(…

4.mysql中的存储过程

创建存储过程和函数 CREATE[DEFINER = {USER | CURRENT_USER}] # 定义者是谁PROCEDURE sp_name ([proc_parameter[,...]])[characteristic ...] routine_bodyCREATE [DEFINER = {USER | CURRENT_USER}]FUNCTION sp_name ([function_name[,...]])[characteristic ...] routine_…