定时器工作不正常:由缓存池回收机制引发的血案

3 篇文章 0 订阅

时序图

时序图描述

问题描述

  1. 操作面板申请了一个一次性计时器OnceTimer(对应缓存别名Cache1)
    ,随后Timer执行完毕,此时引擎自动将该Timer回收到缓存池
  2. 进度条面板申请一个循环计时器LoopTimer来自动隐藏进度条(引擎查看缓存池,发现Cache1已经无用,将其拿出给了LoopTimer);(PS:位什么设计为自动,请联系作者)
  3. 再次打开操作面板,尝试停止已经存在的OnceTimer,但由于(OnceTimer == Cache1 == LoopTimer),实际停止了LoopTimer,至此引发血案(类似c++中野指针…)

问题分析

  1. 直接原因:第1步中OnceTimer应该已经失效,但第3步中却依旧能操作缓存
  2. 本质原因:引擎缓存回收机制有问题,对有引用的OnceTimer进行了回收

问题解决

  1. 最优解决方案:申请Timer时候,系统应返回一个无法直接操作缓存,但能间接查看与修改Timer状态的别名(比如一个数字,并且整个系统运行过程中不重复),而不是Cache本身,这样,就不存在不安全操作(PS:即使主动回收,也顺理成章,因为外部不存在引用
  2. 次优解决方案:对使用过后的OnceTimer手动置空(但实际编码过程中依然容易出错),此时也可以考虑接口开发ref参数,由接口完成
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值