当前位置: 首页 > news >正文

我对CopyOnWrite的思考

 

CopyOnWrite 后文中表述为 COW

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

为什么要这么做?

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

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

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

COW带来的好处!

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

对比Concurrent容器

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

适用场景

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

相关文章:

  • RabbitMQ入门-路由-有选择的接受消息
  • 报告称国产智能手机全球市场份额33.1% 超过韩国
  • iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge
  • 深入理解java虚拟机 精华总结(面试)
  • Spring框架
  • DTS-071007 表结构在源库和目标库中不一致
  • 算法学习之路|聪明的打字员
  • [学习笔记—Objective-C]《Objective-C-基础教程 第2版》第二章~第七章
  • MongoDB入门(二)——MongoDB下载与安装
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • centos7设置静态IP
  • 64位x86的函数调用栈布局
  • 纯文本配置还是注册表
  • “你的优势是什么?
  • 记录项目代码迁移后,UI测试框架的搭建(配置文件的修改、测试脚本试运行)...
  • 4. 路由到控制器 - Laravel从零开始教程
  • If…else
  • Java程序员幽默爆笑锦集
  • JS题目及答案整理
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React Native移动开发实战-3-实现页面间的数据传递
  • select2 取值 遍历 设置默认值
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 程序员该如何有效的找工作?
  • ​卜东波研究员:高观点下的少儿计算思维
  • #if 1...#endif
  • #单片机(TB6600驱动42步进电机)
  • $(function(){})与(function($){....})(jQuery)的区别
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (全注解开发)学习Spring-MVC的第三天
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)可以带来幸福的一本书
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .Net 8.0 新的变化
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20170705]diff比较执行结果的内容.txt
  • [23] 4K4D: Real-Time 4D View Synthesis at 4K Resolution
  • [ai笔记3] ai春晚观后感-谈谈ai与艺术
  • [Android]竖直滑动选择器WheelView的实现
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C#小技巧]如何捕捉上升沿和下降沿
  • [C语言]——函数递归
  • [elastic 8.x]java客户端连接elasticsearch与操作索引与文档
  • [HCTF 2018]WarmUp (代码审计)
  • [HOW TO]怎么在iPhone程序中实现可多选可搜索按字母排序的联系人选择器
  • [LeetCode]—Anagrams 回文构词法
  • [one_demo_9]判断数组是否递增
  • [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
  • [QT]加快qt编译:设置默认多核编译qt
  • [selenium] Handling Untrusted SSL certificate error in firefox
  • [Socket]Unix socket 运行权限问题