当线程用iterator的方法(iterator.next)循环一个collection的的时候,另外一个线程改变了这个collection,就会抛出ConcurrentModificationException。即使同步的collection类,比如 SnchronizedMap 或 SynchronizedList 也只是有条件的线程安全,这是因为所有单独的操作是线程安全的,但是依靠上别的操作结果的混合操作就可能出现线程问题。
Collection<String> myCollection = new ArrayList<String>(10);
myCollection.add("123");
myCollection.add("456");
myCollection.add("789");
for (Iterator it = myCollection.iterator(); it.hasNext();) {
String myObject = (String)it.next();
System.out.println(myObject);
if (someConditionIsTrue) {
myCollection.remove(myObject); //多线程时也会抛出 ConcurrentModificationException
}
}
解决的方法:
(1)多线程的时候:
1)你可以把你的 list 转换成数组用 list.toArray() 然后迭代这个数组,但当 list 很大的时候不推荐这样做。
2)你可以用 synchronized 块把整个 list 操作和迭代全部包裹起来,不过当你的程序是高度并发的时候这个方法会对程序的伸缩性有影响。
3)如果你用 JDK1.5 那么你可以用 ConcurrentHashMap 和 CopyOnWriteArrayList ,它们提供很好的伸缩性,用 ConcurrentHashMap.iterator() 迭代就不会抛出 ConcurrentModificationException。
(2)单线程的时候:
用
it.remove(); //因为it有一个 myCollection 的引用,所以用 Iterator "it" 可以移除当前的对象,以可以用上面第3个方法。
别用
myCollection.remove(myObject); //避免在 Iterator迭代的时候,这会抛出ConcurrentModificationException的。
分享到:
相关推荐
java.util.ConcurrentModificationException 异常问题详解1
NULL 博文链接:https://chenlinbo.iteye.com/blog/832335
java.util.ConcurrentModificationException 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util....
主要介绍了出现java.util.ConcurrentModificationException 问题及解决办法的相关资料,需要的朋友可以参考下
今天小编就为大家分享一篇关于Java源码解析ArrayList及ConcurrentModificationException,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
axis1.4补丁包,解决jdk1.8高并发报ConcurrentModificationException问题,该jar包重新编译jar包的一个class文件,线上环境通过
Map在遍历时候通常 现获得其键值的集合Set,然后用迭代器Iterator来对Map进行遍历。
Spring数据mongodb测试 在Collections.synchronizedList或Collections.synchronizedSet上测试spring数据mongodb ConcurrentModificationException
axis1.4 spring3.0 集成 实现 web service 服务端, axis1.4 客户端认证,授权,访问日志记录,集成spring 解决 PHP 调用web service 无法认证,和解析soap 模板
fastJson的全部资料,包括源码、开发需要用到的jar包和html格式的文档。
这里面包含了大部分的软件测试的专业术语,希望对你有用
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException,...
java.util.ConcurrentModificationException: mutation occurred during iteration [error] scala.collection.mutable.MutationTracker$.checkMutations(MutationTracker.scala:43) [error] scala.collection....
Iterator遍历中 ConcurrentModificationException异常
Axis1.4快速发布服务以及客服端详解(资源中的axis是axis1.4自带的,lib也是它自带的)
基本涵盖Axis 1.4 开发所需要的jar包
ConcurrentModificationException异常 线程安全的集合 线程安全的 List CopyOnWriteArrayList 线程安全的Set 线程安全的Map ConcurrentHashMap ConcurrentSkipListMap java集合 线程不安全的集合 HashMap的特点 ...
axis1.4 jdk8下ConcurrentModificationException bug处理,使用方式,替换原有axis.jar对应class类