前言

CopyOnWriteArrayList是一个线程安全集合,原理简单说就是:在保证线程安全的前提下,牺牲掉写操作的效率来保证读操作的高效。所谓CopyOnWrite就是通过复制的方式来完成对数据的修改,在进行修改的时候,复制一个新数组,在新数组上面进行修改操作,这样就保证了不改变老数组,也就没有一写多读数据不一致的问题了。

具体的实现来看源码,JDK 8。

CopyOnWriteArrayList

定义

public 

在定义上和ArrayList大差不差,不过多解释,有兴趣可以看之前关于ArrayList的文章。

属性

一个是Lock,另一个是一个对象数组。

/** The lock protecting all mutators */

初始化

CopyOnWriteArrayList的初始化容量是0,分为这样的几个步骤。

//在无参构造方法中会调用setArray方法,参数是一个空的对象数组,然后通过setArray把这个空的数组赋值给属性array

需要说明的是另一个有参构造方法,参数可以是一个集合

//按照集合的迭代器返回的顺序创建一个包含指定集合元素的列表

方法

add(E e)

添加一个新元素到list的尾部。

public 

从add方法中我们可以看到所谓的CopyOnWrite是如何实现的,在需要修改的时候,复制一个新数组,在新数组上修改,修改结束取代老数组,这样保证了修改操作不影响老数组的正常读取,另修改操作是加锁的,也就是说没有了线程不安全的问题。

和ArrayList相比较,效率比较低,只添加一个元素的情况下(初始容量均为0),用时是ArrayList的5倍左右,但是随着CopyOnWriteArrayList中元素的增加,CopyOnWriteArrayList的修改代价将越来越昂贵。

除了添加其他的修改操作也都是这样的套路,不做过多解释,如remove,也是加锁,复制新数组。

public 

get

public 

读取的方法就很简单了,按照下标获取对应的元素。

CopyOnWriteArrayList总结

  1. 读写分离,我们修改的是新数组,读取的是老数组,不是一个对象,实现了读写分离。这种技术数据库用的非常多,在高并发下为了缓解数据库的压力,即使做了缓存也要对数据库做读写分离,读的时候使用读库,写的时候使用写库,然后读库、写库之间进行一定的同步,这样就避免同一个库上读、写的IO操作太多。
  2. 场景:读操作远多于修改操作

copyonwritearraylist原理_Java集合干货——CopyOnWriteArrayList源码分析相关推荐

  1. java linkedlist源码_Java集合之LinkedList源码分析

    一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...

  2. java list addall源码_Java集合:ArrayList源码分析

    其实我看到已有很多大佬写过此类文章,并且写的也比较清晰明了,那我为何要再写一遍呢?其实也是为了加深本身的印象,巩固本身的基础html (主要是不少文章没有写出来我想知道的东西!!!​!!!!)java ...

  3. Java集合干货——ArrayList源码分析

    前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体实现,一些基本的都也知道,譬 ...

  4. arraylist扩容是创建新数组吗 java_Java集合干货——ArrayList源码分析

    前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体实现,一些基本的都也知道,譬 ...

  5. Java集合:Hashtable源码分析

    1. 概述 上次讨论了HashMap的结构,原理和实现,本文来对Map家族的另外一个常用集合HashTable进行介绍.HashTable和HashMap两种集合非常相似,经常被各种面试官问到两者的区 ...

  6. 死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...

  7. 【死磕 Java 集合】— LinkedTransferQueue源码分析

    [死磕 Java 集合]- LinkedTransferQueue源码分析 问题 (1)LinkedTransferQueue是什么东东? (2)LinkedTransferQueue是怎么实现阻塞队 ...

  8. 死磕Java集合之BitSet源码分析(JDK18)

    死磕Java集合之BitSet源码分析(JDK18) 文章目录 死磕Java集合之BitSet源码分析(JDK18) 简介 继承体系 存储结构 源码解析 属性 构造方法 set(int bitInde ...

  9. java arraydeque_死磕 java集合之ArrayDeque源码分析

    问题 (1)什么是双端队列? (2)ArrayDeque是怎么实现双端队列的? (3)ArrayDeque是线程安全的吗? (4)ArrayDeque是有界的吗? 简介 双端队列是一种特殊的队列,它的 ...

最新文章

  1. mysql 设置表的大小_mysql InnoDB建表时设定初始大小的方法
  2. u852日期限制解决补丁_用友U8hotfix和补丁包替换原则及注意事项
  3. 程序和计划任务管理( 查看进程ps,控制进程,终止命令进程,top命令,at一次性任务,crontab周期任务)
  4. flink shell出现Could not create the DispatcherResourceManagerComponent
  5. android动画编辑软件,ALM视频动画编辑
  6. android电视打印信息解析,关于液晶电视打印信息
  7. 商品进销差价_商品进销差价概述
  8. 雅虎又泄露 3200 万账户数据,因cookie伪造攻击
  9. 校验子解码问题(Syndrome Decoding)
  10. 工业以太网交换机特点分析及使用注意事项
  11. JVAV - 对接支付宝- 下载对账单接口
  12. 裸眼 3D 技术是什么原理?
  13. Spring Boot中mybatis:Field peopleInfoMapper in ‘**’that could not be found.
  14. Python中随机数种子的作用及使用
  15. 使用OCR技术将扫描PDF转换为可编辑的Word文档。
  16. 用编程Python赚钱的5个方法
  17. Idea使用起来反应比较慢
  18. 企业短信平台 php,梅州PHP短信平台企业,PHP短信平台
  19. python编程阶乘_Python阶乘实现的三种方法
  20. 产品720vr全景摄影展示吸引客户主动浏览

热门文章

  1. 2020对于音视频行业意味着什么?
  2. Xilinx FPGA,“加速”视频质量提升
  3. 面经——Java基础
  4. IDEA设置自定义代码模板
  5. 直播预告 |【数据挖掘主题报告】多样流量复杂场景中智能技术的研究与应用...
  6. 昨天,腾讯百万节点规模管控系统(TSC)诞生了!
  7. 万众瞩目Instant Apps终于全面问世啦
  8. win7 VS2013 新建工程 编译lua5.1 静态库
  9. 如何将rdd导入数据库中【简单实例】
  10. leetcode 678. Valid Parenthesis String | 678. 有效的括号字符串(带缓存的暴力递归)