黑马程序员技术交流社区

标题: 关于CopyOnWriteArrayList的一些疑问 [打印本页]

作者: Lin0411    时间: 2014-5-2 10:43
标题: 关于CopyOnWriteArrayList的一些疑问
本帖最后由 Lin0411 于 2014-5-4 11:07 编辑

再学习多线程的时候提到CopyOnWriteArrayList能消除并发情况下对集合进行遍历操作时的风险。
例如如下代码:
public class test
{        
        public static void main(String[] args)
        {
                List<String> list = new ArrayList<String>();
                list.add("a");
                list.add("b");
                list.add("c");               
                Iterator<String> it = list.iterator();
                while(it.hasNext())
                {
                        String string = (String)it.next();
                        if("a".equals(string))
                        {
                                list.remove(string);
                        }
                        else
                        {
                                System.out.println(string);
                        }
                }
        }

}

编译器会报异常,若改为 if("b".equals(string))则不会报错,但输出结果只有a,能解释一下原因是什么吗?
另外若将ArrayList改为CopyOnWriteArrayList则没有问题,CopyOnWriteArrayList能消除并发风险的原理有点搞不懂,望大神指点。
作者: 李东梁    时间: 2014-5-2 16:59
一般集合不支持并发访问,就是说在遍历的同时不能对其进行增删等操作,
但是list集合例外。
因为list集合有其特有的方法支持并发访问,把Iterator换成listIterator就不会报错了,
这是list集合特有的方法
作者: Lin0411    时间: 2014-5-2 18:02
李东梁 发表于 2014-5-2 16:59
一般集合不支持并发访问,就是说在遍历的同时不能对其进行增删等操作,
但是list集合例外。
因为list集合有 ...

那CopyOnWriteArrayList为什么能支持并发访问呢,还是有点搞不明白。




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