news 2026/4/18 7:23:41

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/4/9 1:06:56

Cap录屏神器完整指南:5个步骤打造专业级屏幕录制

Cap录屏神器完整指南&#xff1a;5个步骤打造专业级屏幕录制 【免费下载链接】Cap Effortless, instant screen sharing. Open-source and cross-platform. 项目地址: https://gitcode.com/GitHub_Trending/cap1/Cap Cap是一款开源跨平台的屏幕录制工具&#xff0c;提供…

作者头像 李华
网站建设 2026/4/17 3:47:45

硬件 - BMS、电池整合

目录 一、电池预充电流与截止电流 1.预充电 2.截止电流 --------------------------------------------------------------------------------- 二、关于电池芯片中电流检测电阻以及SRP和SRN 1. 原理图部分 2.PCB部分 -----------------------------------------…

作者头像 李华
网站建设 2026/4/17 3:54:37

HAMA.bundle:Plex动漫库管理的终极解决方案

还在为Plex动漫库的混乱元数据而烦恼吗&#xff1f;HAMA.bundle作为专为动漫爱好者打造的Plex元数据插件&#xff0c;通过深度整合AniDB数据库&#xff0c;彻底解决了动漫识别不准确、季集分类混乱、海报显示错误等核心痛点。这款强大的元数据管理工具让你的动漫收藏从此井井有…

作者头像 李华
网站建设 2026/4/13 13:33:04

你的金融App还在“猜”用户?是时候让它学会“听”和“记”了

过去十年&#xff0c;金融App一直在追求“千人千面”。通过分析你的点击、浏览、停留时间&#xff0c;试图猜出你可能需要的产品。 但结果往往是&#xff1a;刚查了房贷利率&#xff0c;接下来一周满屏都是贷款广告&#xff1b;偶尔点开基金页面&#xff0c;就被打上“高风险偏…

作者头像 李华
网站建设 2026/4/12 3:01:06

JavaScript如何实现Web文件分片上传与断点续传?

Java老哥外包救星&#xff1a;原生JS大文件上传全栈方案&#xff08;IE9兼容20G断点续传&#xff09; 兄弟&#xff0c;作为甘肃接外包的Java程序员&#xff0c;我太懂你现在的处境了——客户要20G大文件上传&#xff0c;还要文件夹层级保留、IE9兼容、加密传输&#xff0c;预…

作者头像 李华