public static void main(String[] args) {
final List<Integer> ages=new ArrayList<Integer>();
for (int i = 0; i < 100; i++) {
ages.add(i);
}
Thread t=new Thread(){
public void run() {
for (int i = 100; i < 200; i++) {
ages.add(i);
Thread.yield();
}
}
};
Thread t2=new Thread(){
public void run() {
Iterator<Integer> it=ages.iterator();
while(it.hasNext()){
System.out.println(it.next());
Thread.yield();
}
}
};
t2.start();
t.start();
}
以上这段代码会报java.util.ConcurrentModificationException异常。我知道为什么会发生该异常,就是因为集合被其它线程修改了。
知道原因但是却不知道解决方法。我不知道怎么做到我在用迭代器进行遍历的时候,让其它线程修改不了我这个集合。
请高手不吝赐教。

解决方案 »

  1.   

    实际上CopyOnWriteArrayList是在进行add,set等改变List状态(即内部的数组)的方法时,进行保护性拷贝,在完成操作时在赋值给内部的数组,这样就保证了读写的一致性。
      

  2.   


    我觉得可以对读、写方法进行同步,这样的话就退化到Vector了,,,因为每个方法都是同步的,也就没有了ArrayList的性能优势。具体CopyOnWriteArrayList的性能损失要看具体情况,如果是在大量读而少量写的情况下,性能损失还是很小的;反之,很大所以说还要看使用ArrayList的环境,然后选择
      

  3.   

    貌似是List的原因,在Concurrent不行的,试试CopyOnWriteArrayList