Java ConcurrentModificationException异常原因和解决方法
开发中做一个自定义girdview嵌套在listview中,在处理数据时报了这个错。 之以后发现这个错一般是由于对一个数据集合进行循环中对本身这个数据集合进行了增删的操作。后来仔细看了下代码发现是在对 源列表 T取subList时临时容器的赋值方式错了用了等号, 直接把源列表里的引用赋值给了临时容器。然后在后续操作中又往这个引用里添加了元素。导致这个错误的出现,
后来直接把等号改成addAll问题就解决了。
总结:
根本原因:迭代器的modCount和expectedModCount的值不一致。
解决方案:
将需要操作的元素放到中间元素中,并记录操作标志位。在遍历结束后进行增删操作。或自定义迭代器复写其中的相关操作,在操作结束后添加expectedModCount = modCount;
2.多线程中更容易出现该异常,当你在一个线程中对一数据集合进行遍历,正赶上另外一个线程对该数据集合进行增删操作。
解决方案 :1)在使用iterator迭代的时候使用synchronized或者Lock进行同步;
2)使用并发容器CopyOnWriteArrayList代替ArrayList和Vector。