一个有点tricky的死循环(Endless Loop)BUG
一个有点tricky的死循环(Endless Loop)BUG
猪刚烈 发表于3年前
一个有点tricky的死循环(Endless Loop)BUG
  • 发表于 3年前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

这是一个会导致死循环(endless loop)的bug,因为比较有意思所以记录一下。




先看左则的原始代码,两个if分别针对OrCondtion和AndCondition对象内部的child进行迭代,检查每一个child condition是否与给定的值match,对于OrCondtion,依次把每一个child condition的检查结果用or(||)运算串联起来,得出最后的结果,对于AndCondition则是由and(&&)运算串联起来。左侧实现的思路是很直白的,逻辑上也是简单合理的,但是运行时会出现死循环,原因是:对于OrCondtion,如果第一个child的match检测返回true,且还有第二个child的话,在进入while循环后,执行matched=matched||match(iterator.next(),qualifierValueMap); 时,由于matched已经是true,所以||之后的match方法不会被执行,iterator就不会迭代到下一个元素,再次回到while时,hasNext()总是返回true(因为iterator没有向前迭代),所以导致了死循环。对AndCondition也是如此,不同之处是当遇到matched为false时,&&之后的match方法被跳过,然后进入死循环。


实际上,除了死循环,左侧实现还有一个性能问题,以OrCondtion为例,只要在迭代过程中出现任何一个child condition是true就可以结束循环直接返回true了,同样对于AndCondition,只要在迭代过程中出现任何一个child condition是false也可以结束循环直接返回false了,都不需要把所有的child condition都检查一边。

基于上述分析,右侧是修改后的版本。
共有 人打赏支持
粉丝 22
博文 708
码字总数 110
作品 1
×
猪刚烈
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: