文档章节

一个有点tricky的死循环(Endless Loop)BUG

猪刚烈
 猪刚烈
发布于 2014/10/12 11:39
字数 419
阅读 10
收藏 0

这是一个会导致死循环(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都检查一边。

基于上述分析,右侧是修改后的版本。

本文转载自:http://blog.csdn.net/bluishglc/article/details/18308643

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
Windows Server 2008R2使用Batch脚本查看有效连接数

问题 上次使用Python看了 一波远程端口,这次我们使用Win上面的Batch脚本,在控制台上面观察一波指端端口的有效连接数。 batch 说明一下: 就是查询80端口的有效连接数,其实就看有多少人在使...

亚林瓜子
05/11
0
0
二分查找 : 那个隐藏了 10 年的 Java Bug

原文出处:ccmouse 一个偶然的机会,我想起以前还在谷歌上班的时候,有时候大家会在饭桌上讨论最新想出来的一些面试题。在众多有趣又有难度的题目中,有一道老题却是大家都纷纷选择避开的,那...

ccmouse
2017/09/02
0
0
sysfunc 1.1.24 发布, 常用 Shell 库

sysfunc 1.1.24 发布,此版本是个 bug 修复版本,修复了 1.1.23 版本的一个重要的 bug (a potential endless loop in sf_save())。 SysFunc 是一个 Shell 库,主要用于 Unix 系统。它提供了一...

oschina
2014/03/15
662
1
SmartGit 7.0.3 发布,Git 客户端

SmartGit 7.0.3 发布,此版本主要是修复了一些 bug: - Atlassian Stash: for SSH clones pull requests might not show up - Authentication: - authentication failures with http(s) sim......

oschina
2015/09/26
1K
9
Nginx 0.8.47 发布-下载

Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国...

红薯
2010/07/29
392
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
0
0
12.17 Nginx负载均衡

Nginx负载均衡 下面的dig看到可以返回2个IP,就是解析出来的IP,这样我们可以做负载均衡。 dig www.qq.com 1.vim /usr/local/nginx/conf/vhost/fuzai.conf 2.添加如下配置 upstream qq //定义...

芬野de博客
今天
0
0
SSE(Server Send Event 服务端发送事件)

package com.example.demo.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframe......

Canaan_
今天
0
0
jvm调优

1.jvm运行模式 client模式:启动快,占用内存少,jit编译器生成代码的速度也更快. server模式:主要优势在于代码优化功能,这个功能对于服务器应用而言尤其重要. tiered server模式:结合了client与...

Funcy1122
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部