news 2026/2/25 11:46:22

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/2/20 17:09:45

递归:不止是 “自己调用自己”,看完这篇秒懂

递归&#xff1a;不止是 “自己调用自己”&#xff0c;看完这篇秒懂你有没有玩过俄罗斯套娃&#xff1f;打开一个&#xff0c;里面还有一个&#xff0c;再打开&#xff0c;还有一个…… 直到最后一个最小的娃娃出现&#xff0c;游戏才结束。其实在编程世界里&#xff0c;也有这…

作者头像 李华
网站建设 2026/2/25 6:56:36

GalaxyBook Mask:在非三星电脑上解锁Samsung Notes的解决方案

在数字化办公时代&#xff0c;Samsung Notes作为一款功能强大的笔记应用&#xff0c;却因为硬件限制无法在非三星笔记本电脑上使用&#xff0c;这无疑是一个令人遗憾的局限。GalaxyBook Mask项目应运而生&#xff0c;它通过巧妙的注册表修改技术&#xff0c;让你的任何Windows电…

作者头像 李华
网站建设 2026/2/22 9:18:31

硬件 - Layout合集

目录 布局 1. 层 1.1 电源和地的阻抗问题 1.2 单板排布原则 1.3 母板布线原则 1.4 多层板推荐布局 2. 模块划分 2.1 按功能划分 2.2 按频率划分 2.3 按先信号类型划分 2.4 一些注意事项 3.特殊器件布局使用DCDC的时…

作者头像 李华
网站建设 2026/2/22 23:12:28

破局WPF跨平台困境:Avalonia XPF如何让企业级应用征服三大操作系统

破局WPF跨平台困境&#xff1a;Avalonia XPF如何让企业级应用征服三大操作系统 【免费下载链接】Avalonia AvaloniaUI/Avalonia: 是一个用于 .NET 平台的跨平台 UI 框架&#xff0c;支持 Windows、macOS 和 Linux。适合对 .NET 开发、跨平台开发以及想要使用现代的 UI 框架的开…

作者头像 李华
网站建设 2026/2/18 9:25:14

魔法画笔:零门槛解锁AI图像编辑新维度

你是否曾幻想过拥有一支能够"改写现实"的魔法画笔&#xff1f;只需轻轻拖拽&#xff0c;就能让照片中的人物变换姿态、调整服装、改变表情&#xff1f;现在&#xff0c;这个幻想已经照进现实。DragGAN通过点控式AI编辑技术&#xff0c;让每个人都能成为数字世界的造物…

作者头像 李华
网站建设 2026/2/24 11:13:26

如何快速掌握MethylDackel:BS-seq甲基化分析的完整指南

如何快速掌握MethylDackel&#xff1a;BS-seq甲基化分析的完整指南 【免费下载链接】MethylDackel A (mostly) universal methylation extractor for BS-seq experiments. 项目地址: https://gitcode.com/gh_mirrors/me/MethylDackel MethylDackel是一款专为BS-seq&…

作者头像 李华