黑马程序员技术交流社区

标题: 迭代器 并发异常 用多线程处理代码怎么写? [打印本页]

作者: SmallRooker    时间: 2014-8-27 06:04
标题: 迭代器 并发异常 用多线程处理代码怎么写?
package cn.itcast1;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class OutCollection {

        /**
         集合发生的 并发异常  ConcurrentModificationException
         */
        public static void main(String[] args) {
                 List li = new ArrayList ();
                 li.add("abc1");
                 li.add("abc2");
                 li.add("abc3");
                 li.add("abc4");
                 Show(li);
               
        }

        private static synchronized void Show(List li) {
                 Iterator itr = li.iterator();
                        while(itr.hasNext()){
                                Object obj = itr.next();
                                        if(obj.equals("abc2")){
                                                li.add("abc5");
                                        }
                                        else{
                                        System.out.println("next:"+obj);
                                        }
                        }
                        System.out.println(li);
        }

}
作者: 咸菜+萝卜干    时间: 2014-8-27 08:31
使用迭代器的时候不要使用集合的增加(add)、删除方法(remove),会出现并发异常,在迭代的时候只能使用迭代器的方法,比如迭代器提供了一个删除的方法remove,像你这个ArayList的集合,可以使用ListIterator迭代器,提供了add的方法,就不会出现异常了!{:3_47:}与君共勉
作者: 咸菜+萝卜干    时间: 2014-8-27 08:32
咸菜+萝卜干 发表于 2014-8-27 08:31
使用迭代器的时候不要使用集合的增加(add)、删除方法(remove),会出现并发异常,在迭代的时候只能使用 ...

这个就不是多线程能处理的吧!翻翻源代码吧!{:3_67:}
作者: myzhang    时间: 2014-8-27 08:33
昨天刚学到这儿,表示还不会。。。
作者: myzhang    时间: 2014-8-27 08:34
咸菜+萝卜干 发表于 2014-8-27 08:31
使用迭代器的时候不要使用集合的增加(add)、删除方法(remove),会出现并发异常,在迭代的时候只能使用 ...

豁然开朗!!
作者: 回忆~坚    时间: 2014-8-27 09:06
集合工具类Collections里有方法可以传不同步集合返回同步的集合,具体自己去查下API,我只能帮你到这了~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2