A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Lin0411 中级黑马   /  2014-5-2 10:43  /  973 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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能消除并发风险的原理有点搞不懂,望大神指点。

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
一般集合不支持并发访问,就是说在遍历的同时不能对其进行增删等操作,
但是list集合例外。
因为list集合有其特有的方法支持并发访问,把Iterator换成listIterator就不会报错了,
这是list集合特有的方法
回复 使用道具 举报
李东梁 发表于 2014-5-2 16:59
一般集合不支持并发访问,就是说在遍历的同时不能对其进行增删等操作,
但是list集合例外。
因为list集合有 ...

那CopyOnWriteArrayList为什么能支持并发访问呢,还是有点搞不明白。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马