zoukankan      html  css  js  c++  java
  • java中的ConcurrentModificationException异常

    先看这样一段代码:

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    for (String temp : list) {
        if("1".equals(temp)){
          list.remove(temp);
        }
    }

    这是对一个集合进行简单迭代,当集合中的某一个元素与“1”相等则移除该元素,程序运行正常;此时我们把“1”换成“2”:

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    for (String temp : list) {
        if("2".equals(temp)){
          list.remove(temp);
        }
    }

    系统出现java.util.ConcurrentModificationException异常。某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。这是JDK API对ConcurrentModificationException的举例说明。

    产生的原因可参考http://blog.csdn.net/izard999/article/details/6708738。

    若要避免此异常可使用Iterator进行操作:

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    Iterator<String> it = a.iterator();
    while(it.hasNext()){
        String temp = it.next();
        if("2".equals(temp)){
            it.remove();
        }
    }     
    本文为博主原创文章,转载请在明显位置注明出处: http://www.cnblogs.com/qq503665965/
  • 相关阅读:
    协程与IO模型
    进程池与线程池
    GIL全局解释器锁
    线程编程
    进程编程
    基于UDP协议的socket
    异常处理
    jquery mobile外部js无法载入问题
    禁用或限制部分WebKit特性
    eval 返回变量值
  • 原文地址:https://www.cnblogs.com/qq503665965/p/6443021.html
Copyright © 2011-2022 走看看