博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我对CopyOnWrite的思考
阅读量:6991 次
发布时间:2019-06-27

本文共 828 字,大约阅读时间需要 2 分钟。

 

CopyOnWrite 后文中表述为 COW

CopyOnWrite容器即写的时候复制一个新的容器进行写:通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后在新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。

为什么要这么做?

我们需要了解到一个异常叫做:ConcurrentModificationException。通常对容器进行并发的读和写的时候会出现该异常,比如说foreach遍历List的时候往其中add元素。

了解到ConcurrentModificationException异常后,我们就可以结合COW进行思考,如果写操作的时候不复制一个容器,仍然是之前的容器,那么此时并发的读操作就是对之前容器进行的操作,一个容器在被读的时候,又被另外一个线程进行了写操作,会报出上述错误。

所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器,不会发生ConcurrentModificationException异常

COW带来的好处!

可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。

对比Concurrent容器

  • 最大的优势就是COW容器在被写的时候,仍然是可以读的。而Concurrent容器在写的时候,不能读。
  • 不足1:COW容器在写入的时候会进行内部容器的复制,所以内部实现上多了一份核心数据的拷贝赛所需的资源,可以理解为:拿空间换时间
  • 不足2:COW容器仅仅保证了数据的最终一致性,Concurrent容器保证了数据随时的一致性。

适用场景

  • 对数据在操作过程中的一致性要求不高
  • 根据上述不足1进行分析可以得出:更适用于读大于写的场景。换言之COW容器中保存的数据应该是尽可能不变化的。

转载于:https://www.cnblogs.com/LiuChunfu/p/8476650.html

你可能感兴趣的文章
【kafka】celery与kafka的联用问题
查看>>
Python list 增加/插入元素的说明
查看>>
扩展正则表达式及应用
查看>>
内存越界
查看>>
C语言中 ln(以自然对数e为底) lg(以十为底) 以及logab(以a为底,b为真数)的相关知识...
查看>>
32.ExtJS简单的动画效果
查看>>
kali linux: 网卡监听及扫描网络
查看>>
openfaas 简单试用
查看>>
Error: Invalid or corrupt jarfile
查看>>
[PHP] ubuntu 16.04系统下解决MySQL 5.7版本的root用户重置密码问题
查看>>
onSaveInstanceState
查看>>
几种分页方式分析.
查看>>
Oracle Initialzation error instantclient_11_2 32位客户端问题
查看>>
CTF---密码学入门第七题 杯酒人生
查看>>
[译]ASP.NET Core 2.0 视图引擎
查看>>
spring实现定时任务的两种方式
查看>>
mockito简单教程
查看>>
linux profile\bashrc\bash_profile之间的区别和联系
查看>>
25.怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块
查看>>
MySQL日志功能详解
查看>>