CopyOnWrite 是用于解决并发读写的一种策略,在Write的时候对共享变量进行Copy,在副本上进行更新,再把更新好的副本原子性地替换原来的共享变量。写入时复制是一种优化策略,多个调用者同时访问一份资源(内存或硬盘上的数据)时,它们会获取相同的指针访问同一份资源,直到某个调用者想修改资源内容时,系统会复制出一份副本给给调用者。

实现:

  • 读操作Read不涉及对共享变量的更改,因此不需要同步。
  • 如果有多个线程同时申请Write,在各自拷贝的副本上进行修改,然后更新回共享变量,就会导致某些线程的修改被其他线程覆盖。因此Write必须在同步的情况下进行。

优缺点:

  • 由于修改是在副本上进行,所以修改的同时允许其他线程进行读。
  • 由于需要进行拷贝,当然会存在内存占用的问题。
  • 由于在进行写的过程中仍然允许读,所以数据不是实时一致的,只有在写完成后才一致,也就是最终一致。如果需要实时的一致性,建议使用读写锁。

CopyOnWrite 策略适用于那些读远多于写、且对实时性要求不高的操作,优势在读不需要同步。

Java中CopyOnWriteArrayList容器类,就是符合写入时复制思想的CopyOnWrite容器。

https://coderbee.net/index.php/concurrent/20140308/830

 

CopyOnWrite 策略的更多相关文章

  1. Redis 5种数据结构使用及注意事项

    1优缺点 非常非常的快,有测评说比Memcached还快(当大家都是单CPU的时候),而且是无短板的快,读写都一般的快,所有API都差不多快,也没有MySQL Cluster.MongoDB那样更新同 ...

  2. 关于Java集合的小抄

    在尽可能短的篇幅里,将所有List.Map.Set.Queue的特征与实现方式捋一遍.适合所有"精通Java"其实还不那么自信的人阅读. List ArrayList 以数组实现. ...

  3. Redis cluster学习 & Redis常识 & sort操作

    Redis中的5种数据类型String.Hash.List.Set.Sorted Set. Redis源码总代码一万多行. 这篇文章有一些Redis "常识" http://www ...

  4. Java 容器相关知识全面总结

    Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...

  5. Java集合的小抄 Java初学者必备

    在尽可能短的篇幅里,将所有集合与并发集合的特征,实现方式,性能捋一遍.适合所有”精通Java”其实还不那么自信的人阅读. 不断更新中,请尽量访问博客原文. List ArrayList 以数组实现.节 ...

  6. 关于Redis的常识(推荐)

    原文出处: https://github.com/springside/springside4/wiki/redis 版本:V3.0.3 2013-8-1 (@江南白衣版权所有,转载请保留出处) 1. ...

  7. 关于Redis的知识汇总[转]

    1. Overview 1.1 资料 <The Little Redis Book> ,最好的入门小册子,可以先于一切文档之前看,免费. 作者Antirez的博客,Antirez维护的Re ...

  8. 关于Java集合的总结

    (一)List: ArrayList 以数组实现.节约空间,但数组有容量限制.超出限制时会增加50%容量,用System.arraycopy()复制到新的数组,因此最好能给出数组大小的预估值.默认第一 ...

  9. 关于Redis的一些常识

    http://blog.csdn.net/mengxianhua/article/details/8961713 关于Redis的一些常识 2013-05-22 18:00 13315人阅读 评论(0 ...

随机推荐

  1. NYOJ 38 布线问题_(解法1 Kruskal算法)

    时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 南阳理工学院要进行用电线路改造.如今校长要求设计师设计出一种布线方式,该布线方式须要满足下面条件: 1.把全部的楼都供 ...

  2. 安装mongoDB遇见的一个路径问题

    如果安装路径不存在,则不会解压EXE软件! 安装monogoDB后,它不会自动添加执行路径! 意思就是安装路径是D盘下面的mongoDB文件夹,假如不存在这个文件夹,则不会安装成功 你需要添加路径: ...

  3. h5调用手机照相机

    camera.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...

  4. HTML5、CSS3等新特性:

    HTML5:1/绘画 canvas 元素;2/用于媒介回放的 video 和 audio 元素;3/本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失;4/sessionSt ...

  5. D3.js 制作中国地图 .net 公共基础类

    D3.js 制作中国地图 from:  http://d3.decembercafe.org/pages/map/index.html GeoJSON is a format for encoding ...

  6. Python web 框架:web.py

    web.py 是一个Python 的web 框架,它简单而且功能强大.web.py 是公开的,无论用于什么用途都是没有限 制的. web.py 安装: pip install web.py 下面开始我 ...

  7. UITableView 自带编辑删除 自己定义button

    一:UITableView 自带编辑删除 1:实现两个方法就可以 #pragma mark   tableView自带的编辑功能 -(void)tableView:(UITableView *)tab ...

  8. 华为OJ 名字美丽度

    这是一道坑爹的题目,为什么这么说,且看我慢慢分析-- 题目例如以下: 给出一个名字,该名字有26个字符串组成,定义这个字符串的"美丽度"是其全部字母"美丽度"的 ...

  9. Android数据自己主动更新库DataAutoRefresh

    非常多android应用.比方音乐播放器.视频播放器.小说阅读器或者其他须要获取本地磁盘指定数据格式数据列表的应用,在磁盘数据有变化(新增或者删除.比方下载完毕,拔TF卡.换TF卡)时.须要自己主动更 ...

  10. 换站点Logo图片---轻开电子商务系统(企业入门级B2C站点)

    一共2个文件: 显示及上传文件:site/links/img_logo.html 保存图片文件:site/links/img_logo_up1.chtml 在轻开电子商务系统(企业入门级B2C站点)的 ...