黑马程序员技术交流社区
标题:
关于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