文档章节

一个有点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
665
1
Nginx 0.8.47 发布-下载

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

红薯
2010/07/29
395
3
FileZilla Server 0.9.42 发布

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

oschina
2013/12/17
2.7K
6

没有更多内容

加载失败,请刷新页面

加载更多

CDH安装SENTRY

1. 背景 虽然在集群上部署了kerberos认证,但是kerberos只是对用户层面进行认证,凡是认证通过的用户都有全量的访问权限,这很不安全,需要进一步对用户的权限进行控制,Sentry 的作用就是这...

hblt-j
4分钟前
0
0
Ubuntu 18.04 PostgreSQL 11 apt 默认安装某些问题解析

首先默认安装软件(本文以PostgreSQL 11.1为例,其他版本类似)。 sudo apt install postgresql-11 等待软件自动安装并完成配置,启动服务。 服务状态如下: vmware@vmware-virtual-machine:...

白豆腐徐长卿
5分钟前
0
0
一步步动手实现高并发的Reactor模型 —— Kafka底层如何充分利用多线程优势去处理网络I/O与业务分发

一、从《Apeche Kafka源码剖析》上搬来的概念和图 Kafka网络采用的是Reactor模式,是一种基于事件驱动的模式。熟悉Java编程的读者应该了解Java NIO提供了Reactor模式的API。常见的单线程Jav...

Anur
9分钟前
0
0
数字信号处理各种处理及图象

https://wenku.baidu.com/view/b1bb67f1f90f76c661371a75.html?sxts=1544696459935

whoisliang
12分钟前
0
0
rabbitmq学习

使用docker安装rabbit docker run -d --hostname my-rabbit --name rabbit -p 8080:15672 rabbitmq:management--hostname:指定容器主机名称--name:指定容器名称-p:将mq端口号映射到本地...

元谷
27分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部