- 浏览: 142750 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (172)
- java (172)
- c# winform 关于窗体最大化时的是否全屏效果与是否遮盖任务栏 (1)
- c# winform 只运行一个程序实例 (1)
- Shiro权限框架 (1)
- Java字节码(.class文件)的代码解析 (1)
- Hibernate、Spring和Struts工作原理及使用理由 (1)
- 基本PKG处理命令 (1)
- 最近写的代码的小结 (1)
- Dual Palindromes (1)
- 编译TortoiseSVN1.7源代码笔记 (1)
- Android项目代码混淆 (1)
- 关于就业叨咕几句 (1)
- Java重定向System.out和System.err (1)
- IHS与WAS集成插件静默安装 (1)
- 专题地图概述 (1)
- 关于MapXtreme2004附带Sample不能运行的问题 (1)
- SQL注入漏洞 (1)
- 回顾过去 展望未来(写给自己) (1)
- DB2认证考试经验谈(700&&701) (1)
- 今天用到了RM格式文件的分割工具RealProducer (1)
- 搜索引擎还是很有发展前途的 (1)
- 泰利德破解,实现学校机房免费上网 (1)
- Arduino 引言:移动互联外设传感展望 (1)
- c/c++ static 用法总结(三版本合一) (1)
- JQuery与xml的组合谈 (1)
- Android开发之消息处理机制(一)——Handler (1)
- Android开发之PopupWindow (1)
- 解析BitmapData.getPixel32()返回值因何不准确 (1)
- 关于Ext引用js的顺序问题 (1)
- Js事件大全 (1)
- 使用JavaFX2.0编写国际象棋游戏 (1)
- Hibernate/JPA常见异常分析与解决 (1)
最新评论
-
amcucn:
这排版看得
Shiro权限框架 -
WAMING5:
这也太紧凑了,眼看花了
Shiro权限框架 -
longzhun:
大虾 ,看得出你很懒啊!发个贴 这样子怎么看!!!
Shiro权限框架 -
swanky_yao:
活干的不细!!
Spring+Hibernate框架下Mysql读写分离、主从数据库配 -
饶首建:
不错,不过用处比较少吧
批处理设ip和dns
工作中碰到个concurrentmodificationexception。代码如下:
list list = ...;for(iterator iter = list.iterator(); iter.hasnext();) { object obj = iter.next(); ... if(***) { list.remove(obj); }}<span style="color: #0000ff;"><br></span>在执行了remove方法之后,再去执行循环,iter.next()的时候,报java.util.concurrentmodificationexception(当然,如果remove的是最后一条,就不会再去执行next()操作了)<br><br>下面来看一下源码
public interface iterator<e> { boolean hasnext(); e next(); void remove();}public interface collection<e> extends iterable<e> { ... iterator<e> iterator(); boolean add(e o); boolean remove(object o); ...}<br>这里有两个remove方法<br><br>接下来来看看abstractlist
public abstract class abstractlist<e> extends abstractcollection<e> implements list<e> { //abstractcollection和list都继承了collection protected transient int modcount = 0; private class itr implements iterator<e> { //内部类itr int cursor = 0; int lastret = -1; int expectedmodcount = modcount; public boolean hasnext() { return cursor != size(); } public e next() { checkforcomodification(); //特别注意这个方法 try { e next = get(cursor); lastret = cursor++; return next; } catch(indexoutofboundsexception e) { checkforcomodification(); throw new nosuchelementexception(); } } public void remove() { if (lastret == -1) throw new illegalstateexception(); checkforcomodification(); try { abstractlist.this.remove(lastret); //执行remove对象的操作 if (lastret < cursor) cursor--; lastret = -1; expectedmodcount = modcount; //重新设置了expectedmodcount的值,避免了concurrentmodificationexception的产生 } catch(indexoutofboundsexception e) { throw new concurrentmodificationexception(); } } final void checkforcomodification() { if (modcount != expectedmodcount) //当expectedmodcount和modcount不相等时,就抛出concurrentmodificationexception throw new concurrentmodificationexception(); } } }remove(object o)在arraylist中实现如下:public boolean remove(object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementdata[index] == null) { fastremove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementdata[index])) { fastremove(index); return true; } } return false;}private void fastremove(int index) { modcount++; //只增加了modcount ....}<span style="color: #0000ff;"><br><span style="color: #339966;"><br><strong style="color: #800000;">所以,产生concurrentmodificationexception的原因就是:<br>执行remove(object o)方法之后,modcount和expectedmodcount不相等了。然后当代码执行到next()方法时,判断了checkforcomodification(),发现两个数值不等,就抛出了该exception。<br>要避免这个exception,就应该使用remove()方法。</strong></span><br></span>这里我们就不看add(object o)方法了,也是同样的原因,但没有对应的add()方法。一般嘛,就另建一个list了<br><br><br>下面是网上的其他解释,更能从本质上解释原因:<br>iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 iterator 会马上抛出 java.util.concurrentmodificationexception 异常。<br>所以 iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 iterator 本身的方法 remove() 来删除对象, iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
发表评论
-
Hibernate/JPA常见异常分析与解决
2012-02-07 17:24 15141. ClassNotFoundException: ... -
使用JavaFX2.0编写国际象棋游戏
2012-02-07 16:24 1093前面发布了不少Javafx2的教程,不觉手痒,想尝试一 ... -
Js事件大全
2012-02-04 15:34 788一般事件 事件 ... -
关于Ext引用js的顺序问题
2012-02-02 15:49 768今天自己搞了个ext的helloworld,所需的包都 ... -
解析BitmapData.getPixel32()返回值因何不准确
2012-02-02 12:29 1004<div style="widt ... -
Android开发之PopupWindow
2012-01-31 13:48 1684<h1>Android开发之PopupWi ... -
Android开发之消息处理机制(一)——Handler
2012-01-11 15:19 1171<h1>Android开发之消息处理机制( ... -
JQuery与xml的组合谈
2011-12-21 17:18 804JQuery与xml的组合谈 今天谈的是XML,学ja ... -
c/c++ static 用法总结(三版本合一)
2011-12-21 10:34 819<span style="&qu ... -
Arduino 引言:移动互联外设传感展望
2011-12-20 14:08 1328作者:mznewfacer (Wolf Geek) ... -
泰利德破解,实现学校机房免费上网
2011-12-20 13:58 950泰利德破解,实现学校机房免费上网<br> ... -
搜索引擎还是很有发展前途的
2011-12-19 11:49 969相信大家已经听说,在头几天,搜狐推出了一个专业搜索门户 ... -
今天用到了RM格式文件的分割工具RealProducer
2011-12-19 09:19 713项目要加一些视频文件,这些视频都是几个老师对数据结构课 ... -
DB2认证考试经验谈(700&&701)
2011-12-16 17:17 1119很多人都通过了D ... -
回顾过去 展望未来(写给自己)
2011-12-15 16:19 1501本来想用“昨天今天明天”做标题来着,但是人家本山大叔说 ... -
SQL注入漏洞
2011-12-15 12:19 722CSDN上的ASP.NET电子杂志下载下来看,就看到了 ... -
关于MapXtreme2004附带Sample不能运行的问题
2011-12-15 10:54 689</span> -
专题地图概述
2011-12-14 12:49 854<p class="MsoNorma ... -
IHS与WAS集成插件静默安装
2011-12-14 12:04 968<span style="col ... -
Java重定向System.out和System.err
2011-12-13 14:49 1179<div>继承PrintStream类: ...
相关推荐
那么,为什么会抛出这个异常呢?我们可以通过查看 ArrayList 的源码来了解原因。ArrayList 的 iterator() 方法返回了一个 Itr 对象,这个对象实现了 Iterator 接口。Itr 对象有三个成员变量:cursor、lastRet 和 ...
java.util.ConcurrentModificationException 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util....
在Java编程中,`java.util.ConcurrentModificationException` 是一个常见的运行时异常,通常发生在尝试并发修改集合时。这个异常的产生是由于集合类(如HashMap)的非线程安全特性,当你在一个线程中使用迭代器遍历...
在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,主要出现在多线程环境下对集合类(如List、Set、Map等)进行并发修改时。然而,这个异常不仅限于多线程环境,即使在单线程中,如果在遍历...
- **注意事项**:使用`Vector`创建的迭代器时,如果其他线程修改了`Vector`的状态(如添加或删除元素),则可能会抛出`ConcurrentModificationException`异常。 #### 七、`Stack`类 `Stack`继承自`Vector`,实现了...
但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除元素),Iterator将抛出ConcurrentModificationException异常。 Set接口是Collection接口的子接口...
这是Java中最常见的错误之一,当尝试访问一个为null的对象的成员时,程序会抛出此异常。避免这种问题的方法是始终确保对象在使用前已经被初始化,或者在访问其成员之前进行非null检查。 二、数组越界异常...
在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,通常发生在多线程环境下对集合进行迭代和修改操作时。此问题的核心在于,Java的集合类(如ArrayList、LinkedList、HashSet等)并不支持...
java.util.ConcurrentModificationException: mutation occurred during iteration [error] scala.collection.mutable.MutationTracker$.checkMutations(MutationTracker.scala:43) [error] scala.collection....
12. **ConcurrentModificationException**:在并发修改集合时,如果一个线程正在迭代集合,而另一个线程同时对集合进行修改,会出现此异常。推荐使用`CopyOnWriteArrayList`或`ConcurrentHashMap`等并发友好的集合类...
这意味着在多线程环境下,当一个线程正在遍历集合(通过迭代器进行)时,另一个线程修改了集合内容,就会触发快速失败(fail-fast)机制,导致ConcurrentModificationException异常。例如,上述代码中,线程在删除...
- `CopyOnWriteArrayList`和`CopyOnWriteArraySet`:这些列表和集在线程安全的迭代器上有优势,因为它们在修改时复制底层数组,从而避免了迭代过程中的并发修改异常(`ConcurrentModificationException`)。...
- `Enhanced for loop`在遍历过程中不允许直接修改正在迭代的集合,否则会抛出`ConcurrentModificationException`异常。 - 当需要在遍历的同时修改集合时,应考虑使用`Iterator`或其他方法。 #### 四、进阶篇:...
- `java.util.Iterator`的改进:支持`remove()`操作,避免抛出`ConcurrentModificationException`。 ### 4. 性能优化 JDK 1.6对编译器和垃圾收集器进行了优化,提高了运行效率,例如: - **Server VM的改进**: ...
在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式(Iterator Pattern),这是一种常用的设计模式,它提供了一...
《Java 7编程高级进阶》是一本专为有经验的Java开发者设计的教程,旨在深化对Java 7特性和高级编程技术的理解。通过深入学习这本书,你可以掌握Java 7中的新特性,优化你的代码,并提升开发效率。下面将详细探讨Java...
- `ConcurrentModificationException`: 如果在迭代过程中,集合结构被其他线程修改,可能会抛出此异常。为了避免这种问题,通常建议在迭代时不要直接修改集合,或者使用`ListIterator`的`add()`方法添加元素。 6. ...
Fail-safe机制是一种失败安全机制,在这种机制下,出现集合元素的修改,不会抛出ConcurrentModificationException异常。这种机制下的集合容器,例如CopyOnWriteArrayList和ConcurrentHashMap等,都是java.util....
Java并发包,也被称为`java.concurrent`包,是Java编程语言中处理多线程和并发操作的核心工具包。它提供了一系列高效、线程安全的类和接口,使得开发者能够更安全、更容易地编写多线程应用程序。这个压缩包`...