JAVA面试题分享四百四十一:记一个ConcurrentHashMap使用不当导致的并发事故

本文描述了一个基于quartz的任务调度系统中,由于任务状态更新导致ConcurrentHashMap中出现重复任务,引发内存占用和OOM的问题。作者通过排查和重写equals和hashCode方法解决了这一问题,强调了在并发操作中理解数据流和源码的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

功能简介

事故现象

排查结果

解决方案

小结


图片

 

功能简介

这个功能主要是基于quartz的任务调度,主线程开始执行时,会从task表中读取状态是未开始(0)执行中(1)的任务,读取到任务之后,先将任务状态存入ConcurrentHashMap中,用key记录Task信息,value为true(因为仅仅用到ConcurrentHashMapkeyTask保证任务去重作用,所以value可随意设置),再封装成一个定时执行的job提交到quartz中。

此后,定时执行的Job就会根据任务的定时间隔不断根据这些任务的idsend_data表查询这些任务要发送的数据。

图片

当发送的数据达到task的总量时,这个任务的信息就会先从ConcurrentHashMap中删除,同时也会根据任务的id将定时任务的jobquartzdrop掉。

这里我们列举出为task表封装的类,可以看到顶层设计仅仅涉及任务id和任务名称,而任务具体调度详情记录到其成员变量TaskInfo 中:

@Data
public class Task {
    /**
     * 任务号
     */
    private Integer id;

    /**
     * 任务名称
     */
    private String taskName;


    /**
     * 任务详情
     */
    private TaskInfo ta
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之乎者也·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值