Map数据在多线程 情况下出现的问题

公司去年 就接入了  神策大数据分析,去年埋点一直问题不断 修修补补,  一年的续费快完了,大佬说 今年用完了 就不用了,没什么卵用,就是报表做的好看 .....


去年在 做埋点的时候 遇到不少坑,今年 修复的时候也踩map的 坑



是这样的 .我们的埋点会向神策数据分析服务器提交数据,神策java sdk提交数据函数是

sa.track(distinctId, isLoginId, eventName, newMap);

我们队这个函数进行了封装

Map数据在多线程 情况下出现的问题_第1张图片

变成上图的样子一开始 是没有配置 pool 线程池的 就是单线程,上线使用后会发现 特殊情况下   商城业务处理完之后 触发了神策埋点 ,数据原因导致空指针  ,服务器报错后用户的页面就 500了 ,跳转到业务也执行不到了,于是 加入了多线程 处理  ,一加不要紧,暴露出了几个问题


第一个问题 : 


senSors(....);函数中有个map 参数,埋点处直接触发后 map 会出现多线程复用的错误


Map数据在多线程 情况下出现的问题_第2张图片

于是  我定义在senSor函数中 加了一个Map  new    Map = '传进来的参数map';


启动没有报错 万事大吉  提交上线!!




过了 差不多半个月...产品经理 轻轻喊了我一声,我知道大事不好  一定出问题了

果然  一个完美bug  出现在我眼前



在senSor函数中 重新将map 赋值给另一个 新变量 是能绕过 多线程复用问题  毕竟 每条线程拿到的map都是 一个新对象

但是万恶的  业务代码中  有一个 map.clear 的调用,也就是说  在新开启一条线程的一瞬间  主线程是自己已经去执行  map.clear 代码去了,但是 新线程中传入的新对象 newMap  的内存地址 还是和 被clear的对象是一样的...........所以 senSor 函数仅仅提交了一个事件  参数map中 连毛都没有一根



机智的 我马上想到了 map 的clone 函数  ,于是我按下了.  打了一个c  智能提示中并没有clone函数....操 怎么这么奇怪  ,


没错 map只是一个借口  clone 是HashMap这个实现类的 函数,于是 senSors(..)函数中定义 Map map

修改为 HashMap 类型 .....等等

senSors(...)函数是定义在工具类项目中的   ,我们公司 各个分支的代码都是引用这个util的.在util中改东西是作死的


于是,我在模拟环境的版本中这样修复了bug


wap  app  web就三个项目 有使用到 senSors()函数,没错我们公司 有两套 wap app web 项目,因为有苟延残喘的一折购,和精力旺盛的一折吃两个项目版本  是拆分开的.......于是只能留下没有技术的眼泪   按住ctrl 点击senSors()函数  查找6个项目中 每一处埋点...手动修改 (HashMap) map.clone()  ;


修改  提交代码,模拟环境重启.....   打开log   买个东西  又提交数据 ok 写完了


别问为什么写完了..手疼


你可能感兴趣的:(工作中的疑难杂症)