文档章节

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

猪刚烈
 猪刚烈
发布于 2014/10/12 11:39
字数 419
阅读 8
收藏 0
点赞 0
评论 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

二分查找 : 那个隐藏了 10 年的 Java Bug

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

ccmouse ⋅ 2017/09/02 ⋅ 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 ⋅ 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 ⋅ 9

FileZilla Server 0.9.42 发布

FileZilla Server 0.9.42 发布了,改进内容包括: 新特性: 这是最后一个支持 Windows XP 的版本,以后将不再支持 传输命令提供更多回应的详情 Bug 修复和小改动 Fix an endless loop if a c...

oschina ⋅ 2013/12/17 ⋅ 6

Nginx 0.8.47 发布-下载

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

红薯 ⋅ 2010/07/29 ⋅ 3

Python测试远程端口连接时间

人生苦短 我用Python 问题 最近自己服务器访问别人的服务器,有时候会报超时错误,有时候又能够正常访问别人服务器。 思路 最开始猜测是网络不稳定造成的,但是自己没有收集什么时候超时,什...

亚林瓜子 ⋅ 05/10 ⋅ 0

Apache Directory Studio 1.5.3 发布

Apache Directory Studio 是一个 LDAP 的工具平台,用来连接到任何 LDAP 服务器并进行管理和开发工作。 该版本改进内容: fixed a critical bug that makes Studio gone into an endless ev...

红薯 ⋅ 2010/04/06 ⋅ 0

Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

在知乎上的问题,觉得很好,就转载过来记录一下。 Android程序的运行入口是android.app.ActivityThread类的main()方法。(android-23) 而根据Looper.loop()源码可知里面是一个死循环在遍历消息...

xingjm8511 ⋅ 2016/06/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

编译安装apache2.4.33

1. 环境 编译安装apache2.4.33,错误 error: ld returned 1 exit status。 CentOS 7.2apr-1.6.3apr-util-1.6.1httpd-2.4.33 2. 编译报错 编译安装完 apr apr-util 之后,安装httpd-2.4.3......

周云台 ⋅ 21分钟前 ⋅ 0

jsonrpc-4j代码解析

解析文件 AutoJsonRpcServiceImplExporter JsonServiceExporter AutoJsonRpcServiceImplExporter 路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter AutoJsonRpcServi......

郭恩洲_OSC博客 ⋅ 29分钟前 ⋅ 0

百度搜索

from selenium import webdriver import time brower=webdriver.Firefox() brower.get('http://www.baidu.com') input=brower.find_element_by_id('kw') input.send_keys('中南大学') time.s......

南桥北木 ⋅ 36分钟前 ⋅ 0

tomcat 日志记录器

1、日志记录器是记录消息的组件 日志记录器需要与某个servlet 容器相关联 2、Logger 接口 共定义了5种日志级别:FATAL、ERROR、WARNING、INFORMATION、DEBUGGER setVerbosity 设置级别 setC...

职业搬砖20年 ⋅ 37分钟前 ⋅ 0

Thrift RPC实战(三) Thrift序列化机制

1.Thrift基础架构 Thrift是一个客户端和服务端的架构体系,数据通过socket传输; 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports); 通过IDL脚本对传输数据的数据结构...

lemonLove ⋅ 38分钟前 ⋅ 0

网站建设就要像2018世界杯的俄罗斯队大杀四方[图]

今天心情不错,因为昨天晚上观看了世界杯比赛,尤其是对俄罗斯队的大杀四方感到十分霸气侧漏啊,因此我联想到了自己的博客网站,我的博客是去年年底上线的,一直想建设一个关于读书和读后感作...

原创小博客 ⋅ 47分钟前 ⋅ 0

Greenplum 三节点安装教程(非root用户)

Greenplum 三节点安装教程(非root用户) 环境准备 安装vmware,装三台centos 虚拟机设置: 主机名 IP 内存 硬盘 node1 Xxx1 2G 80G node2 Xxx2 2G 80G node3 Xxx3 2G 80G CSDN下载greenplum...

仔仔1993 ⋅ 47分钟前 ⋅ 0

linux 信号机制

signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协...

xxdd ⋅ 48分钟前 ⋅ 0

SpringWind

环境搭建和系统部署

颖伙虫 ⋅ 今天 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部