Iterator之java.util.ConcurrentModificationException
在运行以下代码时,会报java.util.ConcurrentModificationException异常,
 public class Demo {
  public static void main(String[] args) {
   List list = new LinkedList();
   list.add("1");
   list.add("#");
   list.add("2");
   list.add("#");
   list.add("3");
   list.add("#");
   list.add("4");
   Iterator it = list.iterator();
   while(it.hasNext()){
    String element = (String)it.next();
    if("#".equals(element)){
     list.remove(element);
    }
   }
  }
 }
究其原因以及查阅各方资料整理如下:
从API中可以看到List等Collection的实现并没有同步化,如果在多线程应用程序中出现同时访问,而且出现修改操作的时候都要求外部操作同步化;调用Iterator操作获得的Iterator对象在多线程修改Set的时候也自动失效,并抛出java.util.ConcurrentModificationException。这种实现机制是fail-fast,对外部的修改并不能提供任何保证。
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
  所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。List、Set等是动态的、可变对象数量的数据结构,但是Iterator则是单向不可变,只能顺序读取,不能逆序操作的数据结构,当 Iterator指向的原始数据发生变化时,Iterator自己就迷失了方向。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。本例最后的解决方法是使用it.remove();
Iterator之java.util.ConcurrentModificationException的更多相关文章
- java.util.ConcurrentModificationException 解决办法(转载)
		
今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可,测试代码: public cla ...
 - java.util.ConcurrentModificationException  --map
		
key:3-key key:/v1.02-key Exception in thread "main" java.util.ConcurrentModificationExcept ...
 - 对ArrayList操作时报错java.util.ConcurrentModificationException null
		
用iterator遍历集合时要注意的地方:不可以对iterator相关的地方做添加或删除操作.否则会报java.util.ConcurrentModificationException 例如如下代码: ...
 - LinkedList - java.util.ConcurrentModificationException
		
package com.test.io; import java.io.BufferedReader; import java.io.FileNotFoundException; import jav ...
 - java.util.ConcurrentModificationException 解决办法
		
在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除. 则使用会报以下异常:Java.util.ConcurrentModific ...
 - java.util.ConcurrentModificationException 解决办法(转)
		
今天在项目的中有一个需求,需要在一个Set类型的集合中删除满足条件的对象,这时想当然地想到直接调用Set的remove(Object o)方法将指定的对象删除即可,测试代码: public cla ...
 - java集合--java.util.ConcurrentModificationException异常
		
ConcurrentModificationException 异常:并发修改异常,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.一个线程对collection集合迭代,另一个线程对Co ...
 - list删除操作   java.util.ConcurrentModificationException
		
首先大家先看一段代码: public static void main(String[] args) { List<String> listStr = new ArrayList<S ...
 - 再次踩bug:遍历删除list(java.util.ConcurrentModificationException)
		
再次踩bug:遍历删除list(java.util.ConcurrentModificationException) 使用 List<Long> list = new ArrayList& ...
 
随机推荐
- java写的简单通用线程池demo
			
首先声明,代码部分来自网络. 1.入口DabianTest: package com.lbh.myThreadPool; import java.util.ArrayList; import java ...
 - 【bzoj1019】汉诺塔
			
[bzoj1019]汉诺塔 题意 传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1019 分析 思路1:待定系数+解方程 设\(f[n]\)为 ...
 - MyBatis实体类映射文件模板
			
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC " ...
 - hdu  3635 Dragon Balls (带权并查集)
			
Dragon Balls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
 - MySql与SqlServer的一些常用用法的差别
			
MySql与SqlServer的一些常用用法的差别 本文为转载 本文将主要列出MySql与SqlServer不同的地方,且以常用的存储过程的相关内容为主. 1. 标识符限定符 SqlServer [] ...
 - Objective-C:Foundation框架-常用类-NSNumber
			
NSArray.NSDictionary是不可以存储C语言中的基本数据类型的.NSNumber可以将基本数据类型包装成对象,这样可以间接将基本数据类型存进NSArray.NSDictionary等集合 ...
 - Android WebView的使用
			
WebView是View的一个子类,使用它可以在App中嵌入H5页面,可以跟js互相调用. webview有两个方法:setWebChromeClient和setWebClient setWebCli ...
 - 读取DBF文件的部分代码
			
private void BtnOpenInitial_Click(object sender, EventArgs e) { OpenFileDialog file = new OpenFileDi ...
 - (置顶)js实现超过页面一屏后,点击图标滚动到页面顶部top
			
<script type="text/javascript">$(document).ready(function() { var ScrolltoTop = $ ...
 - 在ASP.NET MVC中使用CKEditor和CkFinder
			
在你需要使用editor控件的页面头部添加: <head> ... <script type="text/javascript" src="/ckedi ...