CopyOnWriteArrayList
ArrayList的一个线程安全的变体,其所有可变操作(add、set 等)都是通过对底层数组进行一次新的复制来实现的,代价昂贵。
在CopyOnWriteArrayList里处理写操作(包括add、remove、set等)是先将原始的数据通过Arrays.copyof()来生成一份新的数组,然后在新的数据对象上进行写,写完后再将原来的引用指向到当前这个数据对象,并且加锁。
读操作是在引用的当前对象上进行读(包括get,iterator等),不存在加锁和阻塞。
因为每次使用CopyOnWriteArrayList.add都要引起数组拷贝, 所以应该避免在循环中使用CopyOnWriteArrayList.add。可以在初始化完成后设置到CopyOnWriteArrayList中,或者使用CopyOnWriteArrayList.addAll方法
CopyOnWriteArrayList采用“写入时复制”策略,对容器的写操作将导致的容器中基本数组的复制,性能开销较大。所以在有写操作的情况下,CopyOnWriteArrayList性能不佳,而且如果容器容量较大的话容易造成溢出。

【场景一】对于ArrayList,使用直接方式,一边遍历,一边删除(add也一样),会报错。


// 删除/修改元素
for(String item : list){
list.remove(item);
}

解决办法一:使用迭代器,一边遍历,一边删除,不会报错。

// 删除/修改元素
Iterator it = list.iterator();
while(it.hasNext()){
String ele = it.next();
it.remove();
}

解决办法二:使用CopyOnWriteArrayList,直接方式,一边遍历,一会删除,不会报错。

for(String item : list){
list.remove(item);
}

参考链接:http://caoyaojun1988-163-com.iteye.com/blog/1754686

标签: none

添加新评论