首页 > 其他分享 >分布式锁代码编写问题分析

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

时间:2024-12-16 18:20:13浏览次数:4  
标签:http nio exec 代码 9115 SupplierAccountsController TID 编写 分布式

 

先给大家一段代码示例:

    @Autowired
    Redisson  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,nio,exec,代码,9115,SupplierAccountsController,TID,编写,分布式
From: https://www.cnblogs.com/liran123/p/18610847

相关文章

  • 计算赤纬、时角与理论太阳可照时数(附代码)
    基于Python的可照时数的计算_可照时数的微机计算程序-CSDN博客这篇博客帮我初期找到了计算方向,但他用于计算赤纬(θ)和时角(w)的公式来历比较奇怪,没有沿用。(一)代码frommathimport*defpossibleSunshineDuration(N,lat_deg):""":paramN:日数(N):paramlat_deg:纬度......
  • Python生成雪花、代码雨、绝美圣诞树!?
    下面给大家发一些有趣不知道的Python代码,超级有趣,快去试试!日常放松一下,给爱的人发过去吧!1、绘制分形图形(以科赫雪花为例)importturtledefkoch(t,order,size):iforder==0:t.forward(size)else:foranglein[60,-120,60,0]:......
  • 使用wsimport命令生成webService客户端代码
    wsimport 是JDK自带的一个工具,可以根据WSDL文件生成Java类。1.进入JDK/bin目录,从地址栏进入cmd 2.执行如下命令:wsimport-keep-sD:\tmp-pcom.cn.phone-verbosehttp://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl-keep:是否生成java源文件-s:指定.ja......
  • 用腾讯云AI代码助手开发一款数据库敏感信息检查工具
    引言作为一个优秀的IT技术民工,需要始终学习先进的技术并将技术转换为生产力,目前AI领域编码辅助工具层出不穷,开发者有必要或者说必须要掌握相关工具的使用,以提高编码效率,降低编码错误。这次我通过一个简单的项目和大家分享一下腾讯云AI代码助手的使用。AI开发实践开发环......
  • cordova-plugin-wechat实现微信登录授权,我本地打包可以拉起微信并进入授权成功回调函
    经过打包了很多次的测试,发现问题出在了cordova版本上,之前因为需要降低node.js的版本,重新安装了cordova为最新版本12.0.0,在这个环境下,我打包出来的签名包可以正常拉起微信并进入授权成功回调函数。之前开发配置的cordova版本是11.1.0,这个版本打出来的包就是可以拉起微信,但进入去授......
  • 分布式链路追踪架构设计及核心技术原理
    胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,SpringCloudAlibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电......
  • 代码随想录算法训练营第四十八天|739.每日温度、496.下一个更大元素、503.下一个更大
    1leetcode739.每日温度题目链接:739.每日温度-力扣(LeetCode)文章链接:代码随想录视频链接:单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度哔哩哔哩bilibili思路:就真的是暴力搜索来写这道题目,但是呢,有些示例里面就超时了,至少有点思路了吧,也算是好消息1.1自己的方法能......
  • 代码随想录算法训练营第四十六天|leetcode647. 回文子串、leetcode516.最长回文子序列
    1leetcode647.回文子串题目链接:647.回文子串-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划,字符串性质决定了DP数组的定义|LeetCode:647.回文子串哔哩哔哩bilibili思路:嘿,看不懂有一点,看解析吧1.1视频后的方法其实看完视频以后,感觉这个题目真的不难,我想到了二维......
  • 代码随想录算法训练营第四十五天|leetcode115.不同的子序列、leetcode583. 两个字符串
    1leetcode115.不同的子序列题目链接:115.不同的子序列-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划之子序列,为了编辑距离做铺垫|LeetCode:115.不同的子序列哔哩哔哩bilibili思路:确实看不懂题目,还是看解析吧1.1视频后的方法有一种我看了视频,也没有那么理解是为......
  • 代码随想录算法训练营第四十四天|leetcode1143.最长公共子序列、leetcode1035.不相交
    1leetcode1143.最长公共子序列题目链接:1143.最长公共子序列-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划子序列问题经典题目|LeetCode:1143.最长公共子序列哔哩哔哩bilibili思路:其实我比较清楚的是和上面一道题目的思路,差不太多,但是我不知道非连续的位置应该如何......