写加锁复制数组,读不加锁,数组是volatile修饰,有可见性和有序性,所以可以读到最新值
读写分离的思想,也是volatile关键字的应用

添加新元素时,不在原来数组添加,而是复制出一个新数组,新数组末尾添加新元素,数组指针指向新数组。

    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();}}private E get(Object[] a, int index) {return (E) a[index];}

场景:适合读多写少的场合
放写入数据时,加锁,读取的时原数组,读到的时旧数据

存在两个问题:
1.内存占用问题
大对象,可能引起full gc
2.数据一致性问题
保证数据的最终一致性,不能保证实时一致性

如果写入频繁,用ConcurrentHashMap

CopyOnWriteArrayList原理相关推荐

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

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

  2. CopyOnWriteArrayList原理及算法题存档

    CopyOnWriteArrayList是通过在添加元素的时候复制一份副本,再在其基础上添加完新的元素之后,在将新的数组作为CopyOnWriteArrayList所保存的数组来达到线程安全. 其ad ...

  3. Java并发编程学习 + 原理分析(建议收藏)

    总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 Doug Lea是一个无私的人,他深知分享知识和分享苹果是不一样的,苹果会越分越少,而自己的知识并不会因为 ...

  4. EventBus源码分析

    简介 前面我学习了如何使用EventBus,还有了解了EventBus的特性,那么接下来我们一起来学习EventBus的源码,查看EventBus的源码,看看EventBus给我们带来什么惊喜以及编程 ...

  5. 2023年Java面试题最新整理,附白话答案

    2023年Java开发面试题最新整理,附白话答案 写在前面:本篇面试题整理是我在北京地区进行面试整理得出,常见的基本都在下面了.基本都是可以直接在面试时用白话回答的答案总结,面试时照此回答即可,有其他 ...

  6. 第九章 - 线程安全集合类

    第九章 - 线程安全集合类 线程安全集合类概述 线程安全集合类可以分为三大类: 遗留的线程安全集合如 Hashtable.Vector.线程安全的实现无非直接加synchronized 使用 Coll ...

  7. 985硕,阿里、字节、美团三面,拿下阿里P6+字节offer

    6.1号开始投简历,7.6号开始第一场面试,9.30号收到最后一家意向书,我的秋招结束了! 找工作期间薅了网上不少大佬的羊毛,特别感谢期间给予帮助的各位前辈们.在此记录下秋招的全过程,也算是对帮助我的 ...

  8. Java多线程系列之“JUC集合“详解

    Java集合包 在"Java 集合系列01之 总体框架"中,介绍java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List( ...

  9. 明翰Java教学系列之多线程篇V0.2(持续更新)

    文章目录 传送门 前言 背景知识 并行与并发 线程与进程 内存模型 1. 计算机内存模型 `2. Java内存模型` 2.1 内存交互 2.1.1 交互操作 2.1.2 交互规则 `2.2 并发编程特 ...

最新文章

  1. 致被套基民:老基民的四点教训七点经验(ZT)
  2. ps aux参数说明
  3. 利用 Swoole 给应用写个防火墙
  4. thinkphp用phpexcel读取excel,并修改列中的值,再导出excel,带往excel里写入图片
  5. linux中xjvf指令,linux解压缩命令小结
  6. MySQL Operators(比较操作符,逻辑运算符)
  7. ubuntu 20.04 源码编译 cmake
  8. DB2 char()函数引起全表扫描
  9. ASP.NET 事件(回传)机制
  10. PyTorch 之 Checkpoint 机制解析
  11. zabbix从入门到精通之---Zabbix proxy的配置(一)
  12. Git的commit your changes or stash them before you can merge
  13. drawLine()方法画粗线
  14. 机械工程和人工智能关系
  15. 人工智能是一个骗局?
  16. 如何选择seo优化关键词
  17. EXCLE为什么双击横杠日期才能变成斜杠日期
  18. DAX:LOOKUPVALUE 函数
  19. word文件图标无法显示的问题
  20. 怎样在iPhone、iPad上的Safari浏览器中快速关闭所有标签页?

热门文章

  1. c语言的一些字符串库函数的自己实现
  2. http statusCode 500状态码
  3. npm ERR! code ENOENT npm ERR! syscall open npm ERR! errno -4058 npm ERR! enoent ENOENT: no such file
  4. mybatis批量删除和插入
  5. 手机为什么取消了内存卡?
  6. 对方删了你的微信,你列表依然有ta的存在,该不该也把ta删掉?
  7. 女方父母总是插手家里的事怎么办?
  8. 红利,本质上来自于供求关系的不平衡
  9. access mysql 同步,SQLServer2008 同步Access数据库
  10. ssrs 存储过程参数配置_如何为纯模式配置报告服务(SSRS)