问题描述
我用CopyOnWriteArrayList来保存着一个列表,该列表可能被其他线程改变。而在序列化到流的writeObject方法中,其有概率抛出ConcurrentModificationException,这是为什么呢?应该怎么解决?
解决方案
解决方案二:
该回复于2011-02-14 13:10:05被版主删除
解决方案三:
并发修改异常你在写入的同时,数据有可能被其他程序改动了。希望对你有帮助
解决方案四:
异常底层是由ArrayList里面抛出的,但是按理说CopyOnWriteArrayList说了是线程安全,那么我在直接writeObject的时候应该获得一个不变的ArrayList才对吧。可是竟然会出问题……数据肯定会被修改,只是怎么才能保证在writeObject的时候不出问题。因为程序有不少地方是把对象序列化的,同时不少地方是在修改该对象的,所以想找一个在修改的同时序列化能不出问题的容器……
解决方案五:
多个线程不能同时修改一个集合
解决方案六:
arraylist是线程不安全的,如果用了CopyOnWriteArrayList,其底层是arraylist的话,应该也没有好的办法,除非换成线程安全的数据结构,或者你自己重写。。
解决方案七:
CopyOnWriteArrayList假设在迭代器的迭代中是不会修改这个list的,如果你在迭代过程中通过迭代器去修改它(Iteratoriter...iter.set(xxx))就会出现这个异常。它工作时,修改的操作仅发生在List中定义的方法,如果你想在它的迭代器中也修改它,那还是需要同步的。
解决方案八:
The"snapshot"styleiteratormethodusesareferencetothestateofthearrayatthepointthattheiteratorwascreated.Thisarrayneverchangesduringthelifetimeoftheiterator,sointerferenceisimpossibleandtheiteratorisguaranteednottothrowConcurrentModificationException.Theiteratorwillnotreflectadditions,removals,orchangestothelistsincetheiteratorwascreated.Element-changingoperationsoniteratorsthemselves(remove,set,andadd)arenotsupported.ThesemethodsthrowUnsupportedOperationException.看后面的解释,对iterator的修改貌似也是不支持或不会反映到iterator上的,这个层面来讲应该是安全的,不知道lz能不能还原一小段模拟程序,类似如下:publicstaticvoidmain(String[]args){CopyOnWriteArrayList<Integer>cowal=newCopyOnWriteArrayList<Integer>();cowal.add(1);cowal.add(2);cowal.add(3);List<Integer>sub=cowal.subList(1,2);cowal.add(4);sub.get(0);//throwsConcurrentModificationException}
解决方案九:
楼主,堆栈信息贴一下,还有代码我看了半天CopyOnWriteArrayList也没看出来它怎么可能抛出这个异常