理解
CopyOnWrite就是写时复制容器。在写入数据的时候,会从源容器复制出一个新容器,然后在新容器中添加元素,添加完成之后,再让源容器指针指向新容器。
写时复制容器的好处
可以对CopyOnWrite并发读取,而不需要加锁,因为当前容器不会添加任何元素。
这是一种读写分离的思想,读和写分别使用不同的容器
写时复制容器的缺点
1、每次修改都会新建一个数组,如果源数组很大,修改操作比较频繁,性能就会很低,内存会有大开销
2、数据一致性问题:因为修改并不会马上就能够被读到,即只能保证最终一致性,不能保证实时一致性。
适用场景:
多读少写的场景,比如白名单、黑名单、商品类目的访问,因为大多数是读,偶尔修改;
举例:
假如我们有一个商品的搜索网站,搜索的时候有些关键词是需要被屏蔽掉的,这个时候就可以使用CopyOnWrite存放不能搜索的黑名单,如果用户搜索的关键词在黑名单中,就提示不能搜索
使用写时复制容器需要注意的事情:
1、尽量在初始化的时候指定容器大小,避免容器扩容产生的开销
2、写入数据的时候,最好一次性写入,防止多次复制
demo:把数据放在List中,一次性写入写时复制容器
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
CopyOnWriteArrayList copyOnWriteArrayList = new CopyOnWriteArrayList(list);
}
}
常用方法
写时复制容器常用方法和普通集合差不多