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

本文探讨了在Redis分布式锁中使用异步线程池刷新锁时间的技术挑战。包括线程池配置、异步方法使用限制及spring注入问题,并提出了可能的解决方案。

在实现基于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无法扫描到异步类

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

类中
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值