1.读写分离

写操作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,互不影响。

写操作需要加锁,防止并发写入时导致写入数据丢失。

写操作结束之后需要把原始数组指向新的复制数组。

public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;Object[] newElements = Arrays.copyOf(elements, len + 1);newElements[len] = e;setArray(newElements);return true;} finally {lock.unlock();}
} final void setArray(Object[] a) {array = a;
} @SuppressWarnings("unchecked")
private E get(Object[] a, int index) {return (E) a[index];
}

2. 适用场景

CopyOnWriteArrayList 在写操作的同时允许读操作,大大提高了读操作的性能,因此很适合读多写少的应用场景。

但是 CopyOnWriteArrayList 有其缺陷:

  • 内存占用:在写操作时需要复制一个新的数组,使得内存占用为原来的两倍左右
  • Java 容器数据不一致:读操作不能读取实时性的数据,因为部分写操作的数据还未同步到读数组中。

所以 CopyOnWriteArrayList 不适合内存敏感以及对实时性要求很高的场景。

CopyOnWriteArrayList源码相关推荐

  1. 从面试角度分析CopyOnWriteArrayList源码

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 注:本系列文章中用到的jdk版本均为java8 相比很多同 ...

  2. 面试官系统精讲Java源码及大厂真题 - 15 CopyOnWriteArrayList 源码解析和设计思路

    15 CopyOnWriteArrayList 源码解析和设计思路 古之立大事者,不唯有超世之才,亦必有坚韧不拔之志. 引导语 在 ArrayList 的类注释上,JDK 就提醒了我们,如果要把 Ar ...

  3. CopyOnWriteArrayList源码分析

    基于jdk1.7源码 一.无锁容器 CopyOnWriteArrayList是JDK5中添加的新的容器,除此之外,还有CopyOnWriteArraySet.ConcurrentHahshMap和Co ...

  4. copyof java_死磕 java集合之CopyOnWriteArrayList源码分析

    简介 CopyOnWriteArrayList是ArrayList的线程安全版本,内部也是通过数组实现,每次对数组的修改都完全拷贝一份新的数组来修改,修改完了再替换掉老数组,这样保证了只阻塞写操作,不 ...

  5. Java8 CopyOnWriteArrayList 源码分析

    一.CopyOnWriteArrayList 概述 1.1 概念概述 CopyOnWriteArrayList 是 juc 包下一个线程安全的并发容器,底层使用数组实现.CopyOnWrite 顾名思 ...

  6. copyonwritearraylist原理_Java集合干货——CopyOnWriteArrayList源码分析

    前言 CopyOnWriteArrayList是一个线程安全集合,原理简单说就是:在保证线程安全的前提下,牺牲掉写操作的效率来保证读操作的高效.所谓CopyOnWrite就是通过复制的方式来完成对数据 ...

  7. CopyOnWriteArrayList源码解析

    此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注:在看这篇文章之前,如果对HashMap的层不清楚的话,建议先去看看HashMap源码解析. http:/ ...

  8. Copy-On-Write读写分离策略和CopyOnWriteArrayList源码分析

    Copy-On-Write简称COW,是一种用于程序设计的优化策略.JDK有两种Copy-On-Write容器,CopyOnWriteArrayList和CopyOnWriteArraySet. Co ...

  9. 深读源码-java集合类总结篇

    概览 我们先来看一看java中所有集合的类关系图. 这里面的类太多了,请放大看,如果放大还看不清,请再放大看,如果还是看不清,请放弃. 我们下面主要分成五个部分来逐个击破. List List中的元素 ...

最新文章

  1. integral函数
  2. 初等数论--同余--欧拉函数、欧拉定理、费马小定理
  3. 复现经典:《统计学习方法》​第16章 主成分分析
  4. 代码review工具:Review Board
  5. 给年薪不到48w的程序员提个醒!!
  6. 算法与数据结构--空间复杂度O(1)遍历树
  7. Java JDBC篇1——初识JDBC
  8. 微课|中学生可以这样学Python(3.2节):双分支选择结构
  9. 记录一下很好用的java爬虫代码-很有意思,原理也很简单,一看就懂
  10. uniapp编译成小程序代码过大的处理方法
  11. bin code led_一种led颜色BIN划分方法与流程
  12. Word 里文字对齐推荐这4种方法
  13. 关于微信公众号自动回复文本、图片以及图文
  14. nginx 实现多端口转发
  15. Fiddler与iPhone配合拦截首都图书馆微信小程序请求并多线程模拟请求刷预约 Java HttpGet HttpPost
  16. Golang-beego安装
  17. golang:go+liteIDE在windows环境配置(详细配置+出现问题解决说明)
  18. PHP生成PDF Mpdf扩展
  19. 树莓派wiringPi库初始化
  20. 触手可及的AI:2020十大人工智能APP揭榜时刻

热门文章

  1. 试用 Vista RC1 ,正式版离我们越来越近
  2. lucene学习001
  3. GDataXML解析XML文档
  4. python read_csv chunk_Python 数据分析之逐块读取文本的实现
  5. VMware虚拟机很卡~
  6. docker Harbor 问题
  7. 一篇文章教你学会Java基础I/O流
  8. go包package的使用细节
  9. Hbase hbck2下载编译和基本使用
  10. Spark on K8S 的最佳实践和需要注意的坑