CopyOnWriteArrayList原理
写加锁复制数组,读不加锁,数组是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原理相关推荐
- copyonwritearraylist原理_Java集合干货——CopyOnWriteArrayList源码分析
前言 CopyOnWriteArrayList是一个线程安全集合,原理简单说就是:在保证线程安全的前提下,牺牲掉写操作的效率来保证读操作的高效.所谓CopyOnWrite就是通过复制的方式来完成对数据 ...
- CopyOnWriteArrayList原理及算法题存档
CopyOnWriteArrayList是通过在添加元素的时候复制一份副本,再在其基础上添加完新的元素之后,在将新的数组作为CopyOnWriteArrayList所保存的数组来达到线程安全. 其ad ...
- Java并发编程学习 + 原理分析(建议收藏)
总结不易,如果对你有帮助,请点赞关注支持一下 微信搜索程序dunk,关注公众号,获取博客源码 Doug Lea是一个无私的人,他深知分享知识和分享苹果是不一样的,苹果会越分越少,而自己的知识并不会因为 ...
- EventBus源码分析
简介 前面我学习了如何使用EventBus,还有了解了EventBus的特性,那么接下来我们一起来学习EventBus的源码,查看EventBus的源码,看看EventBus给我们带来什么惊喜以及编程 ...
- 2023年Java面试题最新整理,附白话答案
2023年Java开发面试题最新整理,附白话答案 写在前面:本篇面试题整理是我在北京地区进行面试整理得出,常见的基本都在下面了.基本都是可以直接在面试时用白话回答的答案总结,面试时照此回答即可,有其他 ...
- 第九章 - 线程安全集合类
第九章 - 线程安全集合类 线程安全集合类概述 线程安全集合类可以分为三大类: 遗留的线程安全集合如 Hashtable.Vector.线程安全的实现无非直接加synchronized 使用 Coll ...
- 985硕,阿里、字节、美团三面,拿下阿里P6+字节offer
6.1号开始投简历,7.6号开始第一场面试,9.30号收到最后一家意向书,我的秋招结束了! 找工作期间薅了网上不少大佬的羊毛,特别感谢期间给予帮助的各位前辈们.在此记录下秋招的全过程,也算是对帮助我的 ...
- Java多线程系列之“JUC集合“详解
Java集合包 在"Java 集合系列01之 总体框架"中,介绍java集合的架构.主体内容包括Collection集合和Map类:而Collection集合又可以划分为List( ...
- 明翰Java教学系列之多线程篇V0.2(持续更新)
文章目录 传送门 前言 背景知识 并行与并发 线程与进程 内存模型 1. 计算机内存模型 `2. Java内存模型` 2.1 内存交互 2.1.1 交互操作 2.1.2 交互规则 `2.2 并发编程特 ...
最新文章
- 致被套基民:老基民的四点教训七点经验(ZT)
- ps aux参数说明
- 利用 Swoole 给应用写个防火墙
- thinkphp用phpexcel读取excel,并修改列中的值,再导出excel,带往excel里写入图片
- linux中xjvf指令,linux解压缩命令小结
- MySQL Operators(比较操作符,逻辑运算符)
- ubuntu 20.04 源码编译 cmake
- DB2 char()函数引起全表扫描
- ASP.NET 事件(回传)机制
- PyTorch 之 Checkpoint 机制解析
- zabbix从入门到精通之---Zabbix proxy的配置(一)
- Git的commit your changes or stash them before you can merge
- drawLine()方法画粗线
- 机械工程和人工智能关系
- 人工智能是一个骗局?
- 如何选择seo优化关键词
- EXCLE为什么双击横杠日期才能变成斜杠日期
- DAX:LOOKUPVALUE 函数
- word文件图标无法显示的问题
- 怎样在iPhone、iPad上的Safari浏览器中快速关闭所有标签页?
热门文章
- c语言的一些字符串库函数的自己实现
- http statusCode 500状态码
- npm ERR! code ENOENT npm ERR! syscall open npm ERR! errno -4058 npm ERR! enoent ENOENT: no such file
- mybatis批量删除和插入
- 手机为什么取消了内存卡?
- 对方删了你的微信,你列表依然有ta的存在,该不该也把ta删掉?
- 女方父母总是插手家里的事怎么办?
- 红利,本质上来自于供求关系的不平衡
- access mysql 同步,SQLServer2008 同步Access数据库
- ssrs 存储过程参数配置_如何为纯模式配置报告服务(SSRS)