Golang实践经验和教训( 九 )
b)调用timeout.Cancel() , 它调用了timer.Stop() 。 (请注意 , Golang计时器停止不会阻止已过期的计时器运行 。 )
3.线程2:
a)在该取消调用之前 , 计时器已到期 , 并且回调即将执行 。
b)执行回调 , 它计划新的超时并更新全局映射 。
4.线程1:
a)转换到新的会话状态并注册新的超时 , 从而更新全局映射 。
两个线程正在同时更新超时映射 。 最终结果是无法取消已注册的超时 , 然后又丢失了对线程2完成的重新安排的超时的引用 。 这导致处理程序在一段时间内继续执行和重新安排 , 并执行了非预期的行为 。
锁也解决不了问题
使用锁也不能完全解决问题 。 如果在处理任何事件之前和执行回调之前添加了锁 , 它仍然不能阻止过期的回调运行:
func (timeout* TimeoutHandler) Register() {
推荐阅读
- 原神|原神:不要专门跑去抽4星,以前的教训,让人印象深刻
- 手机游戏|于月仙事件的惨痛教训:不要雇佣一个“手游上瘾”的人!
- edg战队|FPX战胜EDG打出3个名场面,圣枪哥装杯被新人教训,Viper化身院长
- RNG|没有吸取DK的教训?RNG差点“翻车”,米勒说出心里话
- 梦幻西游|梦幻西游:男子沉迷于游戏,半年亏掉30多万,血与泪的教训!
- 大话西游|大话西游2(299)痛的教训!02年老玩家提示不要拿垃圾刷熟练度啊
- 暴雪|暴雪吸取了教训,《暗黑破坏神2:复活》测试的效果还不错
- 我的世界|我的世界:10个“过来人”的经验教训,处理好细节才能笑到最后!
- 华为|又想骗中国放弃自研?特朗普同意解封华为,损失1000亿后买来教训
- 华为|台积电之后,美国瞄准中芯国际?华为余承东:这是教训!