CopyOnWriteArrayList是ArrayList的一个线程安全的变体,即可在并发中使用。而它的可变操作都是通过对ArrayList中存储的数组通过一次新的复制来实现的。
首先讲一下它的用处,如下面的代码:
List<String> list =new ArrayList<String>();
list.add("4");
list.add("5");
list.add("6");
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String o = iter.next();
System.out.println(o);
list.remove(o);//or list.add("adf");等操作
}
执行会抛出异常:java.util.ConcurrentModificationException
当然如果吧 list.remove(o);换成iter.remove();是没问题的!但是iter却没有add方法。
下面说一下如何使用CopyOnWriteArrayList在遍历集合过程中修改元素。代码如下
List<String> list =new CopyOnWriteArrayList<String>();
list.add("4");
list.add("5");
list.add("6");
Iterator<String> iter = list.iterator();
while(iter.hasNext()){
String o = iter.next();
System.out.println(o);
list.remove(o);//or list.add("adf");等操作
}
注:1.上面已经说过,CopyOnWriteArrayList操作是很消耗资源的,使用条件是,当集合中需要修改的元素数远小于集合大小时。
2.因为CopyOnWriteArrayList在做迭代之前是做了一份“快照”,所以此时的iter是不可变的,也就是说如果在此遍历中调用iter.remove();会抛出异常:java.lang.UnsupportedOperationException。
分享到:
相关推荐
java遍历时可修改的容器CopyOnWriteArrayList
CopyOnWriteArrayList的主要特点是:在进行修改操作(例如添加、修改、删除元素)时,它会创建一个新的底层数组的副本进行修改,而不是直接修改原始数组。这样,在并发修改时,可以避免读取和写入同时进行,从而避免...
主要为大家详细介绍了java并发容器CopyOnWriteArrayList实现原理及源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
随机插入、随机删除操作中,用TreeList 效率最高; 2.在只需要追加、迭代的环境下,LinkedList 效率最高; 3.平均效率来讲,ArrayList 相对平衡,但如果海量随机操作,还是会造成性能瓶颈; 4....
java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。 看如下代码: import java.util.ArrayList; import java.util.List; public class Resource3 { public ...
进⾏排序,当我们添加⼀个元素的时候,它会添加到队列的尾部,当我们获取⼀个元素时,它会返 回队列头部的元素。 ● ConcurrentLinkedQueue算是在⾼并发环境中性能最好的队列。底层由单向链表组成,每个节点结 构...
高并发的情况下,一般都要求性能要给力,Vector 显然不够格,所以被遗忘在角落也是“罪有应得”啊。 SynchronizedList 那有些同学可能会说,可以使用 Collections.synchronizedList() 让 ArrayList 变成线程安全啊...
CopyOnWriteArrayList是ArrayList的线程安全版本,从名字推测,CopyOnWriteArrayList是在有写操作的时候会copy一份数据,然后写完再设置成新的数据。CopyOnWriteArrayList适用于读多写少的并发场景。而...
今天小编就为大家分享一篇关于Java源码解析CopyOnWriteArrayList的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
1、CopyOnWriteArrayList位于java.util.concurrent包下,可想而知,这个类是为并发而设计的 2、CopyOnWriteArr
实现List接口表示它可以支持删除、添加和查找等操作。 实现RandomAccess接口表示它可以支持随机访问(强调一点,并不是因为实现了RandomAccess接口,ArrayList才支持随机访问。RandomAccess只是一个标记接口,接口...
1. CopyOnWriteArrayList的简介 2. COW的设计思想 3. CopyOnWriteArrayList的实现原理 4. 总结 2.读线程间
目前上传的是CopyOnWriteArrayList.uml类图,包含该类的各个extends、implements的接口或者类
下面小编就为大家带来一篇基于CopyOnWriteArrayList并发容器(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
用于在遍历操作为主要操作的情况下替代同步的List Queue ConcurrentLinkedQueue *BlockingQueue 提供了可阻塞的put和take方法 生产者-消费者模式 中断的处理策略 传递...
Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
android 进程通信,分为service端和client端,通过AIDL 实现service与client端的同信问题,代码如下 public class BookManagerService extends Service { private String TAG = "BookManagerService"; private ...
对键进行排序 HashTable 标记: class Properties 标记: class 线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。 Collections 标记: 均以synchronized实现, 性能没用提高 synchronizedCollection...
Java 多线程与并发(14_26)-JUC集合_ CopyOnWriteArrayList详解