java.util.ConcurrentModificationException 解决 Android java


在项目里面 遇到了这个bug :


E/AndroidRuntime(22055): java.util.ConcurrentModificationException E/AndroidRuntime(22055): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)

查看了下 这个异常介绍:
An ConcurrentModificationException is thrown when a Collection is modified and an existing iterator on the Collection is used to modify the Collection as well.


ConcurrentModificationException 抛出的条件 大意是:一个迭代器在迭代集合的时候 集合被修改了

举个通俗的栗子

例如 在迭代 Arraylist 的时候 对Arraylist进行增删操作 就会抛出该异常

分析原因:

集合中list set 等 都没有实现同步 , 在多线程中 对集合进行操作时 同步操作都是由外部进行控制
再来看一下Iterator 的工作原理
An iterator over a sequence of objects, such as a collection.If a collection has been changed since the iterator was created, methods next and hasNext() may throw a ConcurrentModificationException. It is not possible to guarantee that this mechanism works in all cases of unsynchronized concurrent modification. It should only be used for debugging purposes. Iterators with this behavior are called fail-fast iterators.Implementing Iterable and returning an Iterator allows your class to be used as a collection with the enhanced for loop.

翻译是 如果集合已经改变自创建迭代器,next和hasNext方法()可能抛出ConcurrentModificationException。这是不可能的,以保证这一机制的工作中不同步并发修改的所有情况。它应该只用于调试的目的。迭代器与这种行为被称为快速失败的迭代器。

按照Iterator的工作原理 应该是在一个独立线程里面完成 且Iterator 执行的时候 迭代的对象必须是不可变的 单向的 顺序的

来看看实际解决方案:


1) 在需要迭代的时候 增加一个 锁

但是比较影响效率

2) 每次前迭代 将集合复制一遍


Arraylist 里面有个toarray()方法
    /**     * Returns a new array containing all elements contained in this     * {@code ArrayList}.     *     * @return an array of the elements from this {@code ArrayList}     */    @Override public Object[] toArray() {        int s = size;        Object[] result = new Object[s];        System.arraycopy(array, 0, result, 0, s);        return result;    }

toArray() 方法 会调用 System.arraycopy(array, 0, result, 0, s); 将集合copy一遍
在多线程 当我需要迭代Arraylist的时候 在集合后面增加一个 toArray() 将集合复制一遍 . 这样对原集合进行的修改操作并不会影响到copy后的新集合

每日前进一步
转载请注明 http://blog.csdn.net/aaawqqq/article/details/43884623
多有不足 希望和大家有更多交流 谢谢



更多相关文章

  1. android SQLite
  2. 图片压缩保存读取操作
  3. Android(安卓)数据库操作 创建 添加 删除 查询
  4. android SQLite
  5. android gallery相关操作
  6. android menu菜单的复选框
  7. Android(安卓)如何使用GPU硬件加速
  8. 利用Android中的SQLite进行CRUD
  9. Android(安卓)AsyncTask 使用

随机推荐

  1. Android中设置控件可见与不可见详…
  2. activity生命周期及横竖屏切换
  3. Android根据联系人姓名首字符顺序读取通
  4. 【 Android(安卓)10 系统启动 】系列 --
  5. android 浮层简单实现、activity设置Them
  6. Android(安卓)ui utils-简单实用的Androi
  7. Android(安卓)Studio 运行项目报错:org.ob
  8. Android属性汇总
  9. Activity与Fragment通过接口回调进行通信
  10. 关于Android的nodpi,xhdpi,hdpi,mdpi,ldp