除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的)。

先回顾一下一个常识:

1、JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个对象,一个线程获取这个引用指向的对象,那么他们之间不会发生ConcurrentModificationException,他们是在虚拟机层面阻塞的,而且速度非常快,几乎不需要CPU时间。

2、JAVA中两个不同的引用指向同一个对象,当第一个引用指向另外一个对象时,第二个引用还将保持原来的对象。

基于上面这个常识,我们再来探讨下面这个问题:

在CopyOnWriteArrayList里处理写操作(包括add、remove、set等)是先将原始的数据通过JDK1.6的Arrays.copyof()来生成一份新的数组

然后在新的数据对象上进行写,写完后再将原来的引用指向到当前这个数据对象(这里应用了常识1),这样保证了每次写都是在新的对象上(因为要保证写的一致性,这里要对各种写操作要加一把锁,JDK1.6在这里用了重入锁),

然后读的时候就是在引用的当前对象上进行读(包括get,iterator等),不存在加锁和阻塞,针对iterator使用了一个叫COWIterator的阉割版迭代器,因为不支持写操作,当获取CopyOnWriteArrayList的迭代器时,是将迭代器里的数据引用指向当前引用指向的数据对象,无论未来发生什么写操作,都不会再更改迭代器里的数据对象引用,所以迭代器也很安全(这里应用了常识2)。

CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的“=”将引用指向新的数组对象上来,这个几乎不需要时间,这样读操作就很快很安全,适合在多线程里使用,绝对不会发生ConcurrentModificationException,所以最后得出结论:CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。

转载于:https://www.cnblogs.com/sunwei2012/archive/2010/10/08/1845656.html

读CopyOnWriteArrayList有感相关推荐

  1. 新生 语不惊人死不休 —— 《无限恐怖》读后有感

    开篇声明,我博客中"小心情"这一系列,全都是日记啊随笔啊什么乱七八糟的.如果一不小心点进来了,不妨直接关掉.我自己曾经写过一段时间的日记,常常翻看,毫无疑问我的文笔是很差的,而且心 ...

  2. DayDayUp:2019.12.30吴晓波2020年终秀演讲《预见2020:来海边,拾起信心》读后有感

    DayDayUp:2019.12.30吴晓波2020年终秀演讲<预见2020:来海边,拾起信心>读后有感 导读:2019年,过的好不好?有人豪情万丈,有人强颜欢笑. 互联网平台带来了方便快 ...

  3. 大道至简 读后有感

    大道至简   读后有感 今天的读后感是在读完第二章之后写的,这一章的标题乍一看很有意思,题为是懒人造就了方法,其实细细一品,很是有道理.这章也分为四节,分别是"是懒人造就了方法", ...

  4. 读后有感 - UI设计师必知:线框图、原型和视觉稿

    读后有感 - UI设计师必知:线框图.原型和视觉稿 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作 ...

  5. 读后有感 - 残忍但诚实的忠告:您没钱,就不要掺和这事了

    读后有感 - 残忍但诚实的忠告:您没钱,就不要掺和这事了 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致" ...

  6. 复旦大学《数学分析》教学大纲,读后有感

    该<分析>大纲读后,犹如时间倒转,回到19世纪的马克思撰写<数学手稿>时代,-- 但是,时光不能倒流.进入20世纪,数学公理化时代终于到来了.1930年,哥德尔紧致性定理:19 ...

  7. 人为什么而活着-----听苏鹏读白有感

      今天在苏鹏老师的个人blog站点上(www.supengcast.net),看到一则关于"人为什么活着"的贴子, 贴子的主题是 这  样的-----"最近有个负面新闻 ...

  8. 有人负责,才有质量:写给在集市中迷失的一代(读后有感)

    读了这篇文章以后,确实引发了我很多的思考,也对我接下来的学习有了很大的帮助. 简单概括为以下几点: 1.许多人虽作为一名IT人士,但他们的基本功不扎实,仍有欠缺,也缺乏规范化开发软件的过程. 作者说, ...

  9. 读文有感-惠普前总裁孙振耀指点职业规划

    我一般读文章很少转帖,为什么呢?当你在google搜索一个主题的时候,发现出来一篇文章,你接着想多看几篇相关的文章,获得更多的思路的时候,往往你发现很多来自于多个网站的,但内容都还是和第一页看到相同的 ...

最新文章

  1. 2019年牛客多校第1场 赛后总结
  2. CIA败给维基解密 专家称AI将改变黑客行为
  3. Linux 配置nfs
  4. easyui tabs 使用iframe 出现两个垂直滚动条 解决方法
  5. JZOJ 5274. 数组
  6. 应用回归分析何晓群_二战上岸人大20年应用统计高分经验帖
  7. 前端学习(2040)vue之电商管理系统电商系统之执行build命令所有的警告
  8. 第十二题:设int x=1,float y=2,则表达式x/y的值是:
  9. Facebook 有序队列服务设计原理和高性能浅析
  10. linux下创建svn仓库及用户
  11. Access数据库学习总结(1)
  12. 转录组:STAR-Fusion融合基因
  13. 2022-2027年中国氮化硼行业市场运行现状及投资战略研究报告
  14. 最新各大互联网公司薪酬盘点!你想好去哪家了吗?
  15. html中加号实体,纯css实现加号“+”效果(代码示例)
  16. unity3D -- 压缩图片
  17. 应届毕业生2012求职之路
  18. C# Dictionary源码解析
  19. C语言编程>第十八周 ⑧ 给定程序中,函数fun的功能是:将形参指针所指结构体数组中的三个元素按num成员进行升序排列。
  20. Mysql如何实现隔离级别 - 可重复读和读提交 源码分析

热门文章

  1. python编程 语言-Python现在还是最火的编程语言吗?
  2. python 画图 内存-用python 10min手写一个简易的实时内存监控系统
  3. python量化投资必背代码-基于python的开源量化交易,量化投资架构
  4. python编程基础语法-Python编程基础语法快速入门
  5. python处理excel教程实例-python如何处理excel数据
  6. 初学者python用哪个版本好-python用哪个版本好
  7. 编程没基础学python多长时间--零基础学Python,从入门到精通需要多长时间
  8. python主要用于什么-python主要用于哪些方向
  9. python怎么读文件内容-Python读取文件内容为字符串的方法(多种方法详解)
  10. python从小到大的顺序输出-python从小到大的顺序输出