今天在对map进行遍历的程序中发现抛出ConcurrentModificationException 异常:
一个线程中:
Map<byte[],byte[]> map = new ConcurrentHashMap<byte[],byte[]>();
while((row = results.next()) != null){
map.clear();
...
queue.put(map);
}
另一个线程中:
while(queue.size() > 0){
line = queue.poll();
if(line == null)
continue;
Iterator<Map.Entry<byte[],byte[]>> it = line.entrySet().iterator();
while(it.hasNext()){
...
}
}
即使读写线程分别只用一个,也会抛出该异常。
原因是Iterator是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
(
http://www.iteye.com/topic/124788)
所以当读线程中执行了map.clear()后,写线程的Iterator指向的原始对象就变化了,导致抛出异常。修改读线程代码为:
Map<byte[],byte[]> map;
while((row = results.next()) != null){
map = new ConcurrentHashMap<byte[],byte[]>();
...
queue.put(map);
}
问题解决。
分享到:
相关推荐
java.util.ConcurrentModificationException 异常问题详解1
主要介绍了出现java.util.ConcurrentModificationException 问题及解决办法的相关资料,需要的朋友可以参考下
NULL 博文链接:https://chenlinbo.iteye.com/blog/832335
java.util.ConcurrentModificationException 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util....
Iterator遍历中 ConcurrentModificationException异常
Map在遍历时候通常 现获得其键值的集合Set,然后用迭代器Iterator来对Map进行遍历。
今天小编就为大家分享一篇关于Java源码解析ArrayList及ConcurrentModificationException,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
axis1.4补丁包,解决jdk1.8高并发报ConcurrentModificationException问题,该jar包重新编译jar包的一个class文件,线上环境通过
axis1.4 spring3.0 集成 实现 web service 服务端, axis1.4 客户端认证,授权,访问日志记录,集成spring 解决 PHP 调用web service 无法认证,和解析soap 模板
java.util.ConcurrentModificationException: mutation occurred during iteration [error] scala.collection.mutable.MutationTracker$.checkMutations(MutationTracker.scala:43) [error] scala.collection....
Spring数据mongodb测试 在Collections.synchronizedList或Collections.synchronizedSet上测试spring数据mongodb ConcurrentModificationException
fastJson的全部资料,包括源码、开发需要用到的jar包和html格式的文档。
这里面包含了大部分的软件测试的专业术语,希望对你有用
3. 迭代过程中,即使Map结构被修改,也不会抛ConcurrentModificationException异常; 4. 除了数组+链表+红黑树的基本结构外,新增了转移节点,是为了保证扩容时的线程安全的节点; 5. 提供了很多Stream流式方法,...
ConcurrentModificationException异常 线程安全的集合 线程安全的 List CopyOnWriteArrayList 线程安全的Set 线程安全的Map ConcurrentHashMap ConcurrentSkipListMap java集合 线程不安全的集合 HashMap的特点 ...
只读迭代:由于写时复制的机制,CopyOnWriteArraySet 的迭代器是只读的,即迭代过程中不会抛出 ConcurrentModificationException 异常。但是,迭代器获得的数据可能不包含最新的修改。 较高的内存占用:由于每次...
基本涵盖Axis 1.4 开发所需要的jar包
避免在循环中修改集合,可能导致ConcurrentModificationException。 异常处理: 不要忽视异常,合理捕获并处理它们。 不要过度使用try-catch,应尽量抛出业务异常给上层处理。 使用finally块进行资源清理。 并发...