【踩坑专栏】关于实现异步多线程的一些踩坑

news2024/11/15 15:51:12

在实现基于redis的分布式锁的时候,有一项功能,就是通过开启异步线程,对还没有unlock的key进行定时刷新,延长时间。

初始版本是New一个线程start。我们知道New一个线程,用了没多久又抛弃,这种方法非常消耗资源。因此我考虑能不能用线程池的方式,来获得线程。

如何配置一个异步线程池,这个我就不多说了,无非是注入一个线程池的bean,@EnableAsync ,@Async等。这些教程非常多,搜一搜就有了。我这里讲一下我遇到的坑。

由于分布式锁的实现类里,有一些成员变量,如针对线程的指针,计算重入次数的计数等,而这些成员变量是不能共享的,所以肯定是不能直接@Component注册为单例的。那能不能注册为其他的类型呢,我们知道,@Component注解还可以通过value指定scope,
在这里插入图片描述
多例可不可以呢?多例,也就是说每次调用到这个类的时候,就生成一个新的实例过来。这显然是不符合预期的。另外多例还有一个坑,就是由于这个指针是一直被单例对象(如某个@Service的业务层)持有,因此在没有断开引用的情况下,是不会给出新的对象的。也就是说它在单例对象如Service或者Controller中实际上也是单例的。
其实最符合我们预期的,应该是request这种类型,在一次请求中,分布式锁的对象始终是一个,对于不同的request,是给出不同的分布式锁的对象。考虑到上述prototype的问题,request是否有同样的问题还未可知,我想后面尝试着写一个自定义的request类型的scope,看下有没有问题。

好,上述讲完了分布式锁为什么至少要是request类型的,那么接下来,就是遇到的坑了。
如下方式会使@Async失效[1]

异步方法使用static修饰

异步类没有使用@Component注解(或其他注解)导致spring无法扫描到异步类

异步方法不能与被调用的异步方法在同一个类中

类中需要使用@Autowired或@Resource等注解自动注入,不能自己手动new对象

如果使用SpringBoot框架在启动类或配置类中增加@EnableAsync注解

因为分布式锁本身是没有注入spring,它里面的执行异步任务的异步类对象(在分布式锁中为一个成员变量,new出来的),由于也拥有布尔类型的成员变量而无法注入,所以异步会失效变为同步!

当然了,即使异步类能够注入到spring中,但是在以@Autowired的方式注入到分布式锁中,你在new出分布式锁后,debug到分布式锁中,会看到成员变量-异步类为Null。原因我猜测是没有注入spring的类,你new出来后,其中autowired的对象无法生效!

综上所述,问题导致现在分布式锁卡在了这里,似乎使用线程去异步刷新锁的时间是一个不可能完成的任务,除非你舍得用new一个线程然后start的方式去执行线程!问题我会在想想,如果有新的进展我这里会更新,如果有大佬看到了,也请大佬不吝赐教,是否有能够完成这种需求的方案~

参考文章:
[1],springboot 开启一个异步线程

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

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

相关文章

【浅学Java】SpringBoot 日志文件

SpringBoot 日志文件1. 认识日志文件1.1. 日志文件有什么用?1.2 日志文件的格式2. 自定义日志文件的打印3. 日志的持久化3.0 什么时日志持久化3.1 设置日志名称3.2 设置日志目录3.3 持久化日志的特点4. 日志的级别5. 设置“日志级别”来筛选日志6. 简化日志打印——…

量子计算(十二):量子线路与测量操作

文章目录 量子线路与测量操作​​​​​​​ 量子线路与测量操作​​​​​​​ 量子线路是由代表量子比特演化的路线和作用在量子比特上的量子逻辑门组成的。量子线路产生的效果,等同于每一个量子逻辑门依次作用在量子比特上。在真实的量子计算机上,最…

HTML CSS游戏官网网页模板 仿绝地求生吃鸡游戏网站 大学生游戏介绍网站毕业设计 DW游戏主题网页模板下载

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

[附源码]Python计算机毕业设计Django影院管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

使用yum info查看软件包信息与常用软件包

记录:357 场景:在CentOS 7.9操作系统上,使用yum info查看软件包信息,包括软件包名称、适用架构、版本号、发行版、软件大小、仓库名称、概要、URL、许可证、描述。 版本: 操作系统:CentOS 7.9 1.iptabl…

【现代机器人学】学习笔记三:前向运动学(Forward Kinematics)

这节的内容比较简单,主要配合习题来看。 在掌握方法以后,对常规的有许多移动副或转动副结构组成的机械臂,计算正向运动学则非常简单。 齐次变换法: 这种方法的特点是,只研究当前关节和上一个关节的旋转平移&#xf…

供应商关系管理与企业内容管理 (ECM) 相结合,帮助解决采购存在的五个关键挑战

供应商关系管理与企业内容管理 (ECM) 相结合,帮助解决采购存在的五个关键挑战 采购过程包括将制造需求转化为供应商需求、如何管理供应商关系、以及生产产品所需的商品和服务的订购。 领先的制造、制药、食品和自然资源组织正在意识到&#…

【性能优化】pc端与移动端图片性能优化

目录 优化方向 优化方式 1.域名收敛 2.使用CDN节点 3.设置缓存 4.图片懒加载 5.用户图片上传限制 6.使用OSS服务压缩 7.使用OSS缩放 8.合成雪碧图 9.使用svg图片 在前端项目中图片的性能优化也有不少可以提升的地方,那么有哪些性能优化的点呢&#xff1f…

[附源码]Python计算机毕业设计Django游戏交易平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

NEMUCOD病毒jse样本分析

该病毒使用微软的JScript编写,能够直接运行在Windows操作系统之上,采用了加密和混淆手段对抗监测,可检测是否运行在虚拟机中和系统中是否存在分析工具,可感染可移动存储介质,主要功能为下载器。CC服务器为185.159.82.1…

牛客网刷题【BC114\BC123\BC125\BC13\BC93\BC95】

目录 一、BC114 小乐乐排电梯 二、BC123 小乐乐找最大数 三、BC125 小乐乐转换成绩 四、BC13 ASCII码 五、BC93 统计数据正负个数 六、BC95 最高分与最低分之差 一、BC114 小乐乐排电梯 #include <stdio.h>int main() {int n0;scanf("%d",&n…

Aspose.Words 22.12.0 for NET cRACK

.NET API 来处理 Word 文件 无需使用外部软件即可创建、编辑、呈现 Word 文档并将其转换为多种格式。您还可以生成报告以可视化数据。 .NET 的 Aspose.Words Aspose.Words for .NET 是一种高级文档处理 API&#xff0c;可对各种文件格式执行广泛的管理和操作任务。API 支持…

(文章复现)5.基于BP神经网络的风电功率预测方法(MATLAB程序)

联系方式&#xff1a;2645521500 复现文章&#xff1a; 基于BP神经网络的风电功率预测方法——刘立群&#xff08;2021年&#xff09; 摘要&#xff1a; 风电功率预测结果的准确性&#xff0c;不仅关系到风力发电厂的综合运行效率&#xff0c;也与区域运行成本具备直接联系…

Java面试-MySQL事务专题

链接&#xff1a;https://pan.baidu.com/s/1mw4sej8BzdHNCkaib4ebeg 提取码&#xff1a;j2qu 1 事务的四个特点是什么&#xff1f;他们是如何实现的&#xff1f; ACID-原子性、一致性、隔离性和持久性。 ACID原理原子性undolog一致性通过其他三个特性来实现的隔离性锁MVCC持…

java计算机毕业设计ssm校园志愿者服务系统u7thd(附源码、数据库)

java计算机毕业设计ssm校园志愿者服务系统u7thd&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

初学者必刷题---PTA基础编程题目集第一期

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​ &#x1f4e3;系列专栏&#xff1a;初学者必刷题—鹏哥推荐 &#x1f4ac;总结&#xff1a;希望…

STC 51单片机62—— Proteus仿真多位数码管稳定显示 不抖动

#include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int //uchar code dis_code[]{0x80,0xf8,0x82,0x92,0x99,0xb0,0xa4,0xf9}; //共阳数码管段码表 //共阴字形码表【实验】数码管实验时&#xff0c;一定要将点阵模块跳…

玩转系统|如何Windows Update自动更新

目录 为什么要关闭Windows自动更新&#xff1f; 1、防止在工作时间突然中断计算机。 2、应用程序兼容性变差。 可能会导致系统损坏。 关闭Windows自动更新的几种方法&#xff01; 方法一&#xff1a;通过Windows设置关闭Windows自动更新 方法二&#xff1a;通过组策略编…

如何查看浏览器页面缓存内容(代码控制台)【详细教程】

如何查看浏览器页面缓存内容——代码&控制台知识调用前言引入控制台输入代码查看在控制台application查看知识调用 文章可能需要用到的知识&#x1f525;&#x1f525;&#x1f525;浏览器缓存有哪些&#xff08;通用缓存有哪些&#xff09; 前言引入 浏览器有多种缓存&a…

密码重置、API调用、远程命令,Zabbix用户必知的几个技巧

作者&#xff1a;张思德&#xff0c;Zabbix社区签约专家&#xff0c;2017-2022Zabbix中国峰会讲师 前言 Zabbix版本迭代很快&#xff0c;而且每个版本都会有很多新特性&#xff0c;有时有一个不起眼的小的更新却造成很多老司机翻车&#xff0c;以下主要介绍Zabbix几个常见的知识…