news 2026/9/24 5:02:18

COW类并发容器简介及CopyOnWriteArrayList源码分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
COW类并发容器简介及CopyOnWriteArrayList源码分析

COW类并发容器

COW类并发容器,全称:Copy On Write容器,写时复制容器。(读写分离容器)
原理:
向容器中添加元素时,先将容器进行复制,复制出一个新容器,然后将元素添加到新容器中,再将原容器的引用指向新容器。
并发读的时候不需要锁定容器,因为原容器没有变化,所以可以读取原容器中的值,使用的是一种读写分离的思想。
注意:
CopyOnWrite容器只能保证数据的最终一致性,不能保证数据实时一致性。
所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。

CopyOnWriteArrayList源码分析

publicclassCopyOnWriteArrayList<E>{//底层基于数组实现的privatetransientvolatileObject[]array;publicCopyOnWriteArrayList(){setArray(newObject[0]);}finalvoidsetArray(Object[]a){array=a;// array = new Object[0]}//add方法:publicbooleanadd(Ee){finalReentrantLocklock=this.lock;lock.lock();try{//返回底层array数组,给了elementsObject[]elements=getArray();//获取elements的长度---》获取老数组的长度intlen=elements.length;//完成数组的复制,将老数组中的元素复制到新数组中,并且新数组的长度加1操作Object[]newElements=Arrays.copyOf(elements,len+1);//将e元素放入新数组最后位置newElements[len]=e;//array数组的指向从老数组变为新数组setArray(newElements);returntrue;}finally{lock.unlock();}}finalObject[]getArray(){returnarray;//返回底层数组}privatebooleanaddIfAbsent(Ee,Object[]snapshot){finalReentrantLocklock=this.lock;lock.lock();try{//取出array数组给currentObject[]current=getArray();intlen=current.length;if(snapshot!=current){// Optimize for lost race to another addXXX operationintcommon=Math.min(snapshot.length,len);//遍历老数组:for(inti=0;i<common;i++)//eq(e, current[i])将放入的元素和老数组的每一个元素进行比较,如果有重复的元素,就返回false,不添加了if(current[i]!=snapshot[i]&&eq(e,current[i]))returnfalse;if(indexOf(e,current,common,len)>=0)returnfalse;}//完成数组的复制,将老数组中的元素复制到新数组中,并且新数组的长度加1操作Object[]newElements=Arrays.copyOf(current,len+1);//将e元素放入新数组最后位置newElements[len]=e;//array数组的指向从老数组变为新数组setArray(newElements);returntrue;}finally{lock.unlock();}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 19:40:27

告别“大海捞针“:InternLM2.5-1M如何让百万字长文本变得触手可及?

还记得那个让你抓狂的场景吗&#xff1f;一份200页的合同摆在眼前&#xff0c;你需要在密密麻麻的条款中找出那个关键的风险点。或者面对上百篇学术论文&#xff0c;想要快速梳理出核心观点却无从下手。现在&#xff0c;这些困扰将成为过去式。 【免费下载链接】InternLM Offic…

作者头像 李华
网站建设 2026/9/21 23:48:21

如何快速解决PyTorch Geometric TUDataset加载问题:5个实战技巧

如何快速解决PyTorch Geometric TUDataset加载问题&#xff1a;5个实战技巧 【免费下载链接】pytorch_geometric Graph Neural Network Library for PyTorch 项目地址: https://gitcode.com/GitHub_Trending/py/pytorch_geometric PyTorch Geometric TUDataset是图神经网…

作者头像 李华
网站建设 2026/9/23 4:46:05

BetterDiscord 深度定制指南:打造属于你的专属聊天体验

BetterDiscord 深度定制指南&#xff1a;打造属于你的专属聊天体验 【免费下载链接】BetterDiscordApp Better Discord App enhances Discord desktop app with new features. 项目地址: https://gitcode.com/gh_mirrors/be/BetterDiscordApp 你是否曾经觉得 Discord 的…

作者头像 李华
网站建设 2026/9/22 13:10:36

BUUCTF[jarvisoj_level2_x64]

步骤使用checksec查看使用ida(pro)打开根进vulnerable_function函数依旧是栈溢出这道题我们无法使用上一题的32位来直接使用plt表来跳转到system,所以我们使用ROPgadget使用指令 ROPgadget --binary 文件名 来获取信息这里可以查看到pop rdi;ret的地址在64位中前几个参数我们是…

作者头像 李华
网站建设 2026/9/24 4:16:02

前端如何通过FormData实现大文件分片上传?

网工大三党文件上传救星&#xff1a;原生JS实现10G大文件上传&#xff08;Vue3IE8兼容&#xff09; 兄弟&#xff0c;作为刚入坑网络工程的山西老狗&#xff0c;我太懂你现在的处境了——老师要10G大文件上传的毕业设计&#xff0c;网上找的代码全是“断头路”&#xff0c;后端…

作者头像 李华
网站建设 2026/9/23 19:47:33

.NET WebForm如何支持大文件上传的进度显示?

毕业设计&#xff1a;企业级文件传输系统方案探索 在毕业设计选题阶段&#xff0c;我结合自身兴趣与计算机专业所学&#xff0c;确定了企业级文件传输系统这一课题。近期&#xff0c;我在网上搜索相关资料、参与论坛交流、加入多个QQ群和微信群&#xff0c;但收获不尽如人意。很…

作者头像 李华