news 2026/4/23 16:21:39

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/23 12:10:38

Fritzing电子设计终极指南:从电路新手到专业创客的完整教程

你是否曾经面对复杂的电路图一头雾水&#xff1f;是否希望有一款工具能像搭乐高一样设计电路&#xff1f;今天&#xff0c;我将带你深入了解Fritzing——这款让电子设计变得直观有趣的开源神器&#xff01;&#x1f3af; 【免费下载链接】fritzing-app Fritzing desktop applic…

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

SDXL VAE FP16修复终极指南:彻底解决显存溢出问题

SDXL VAE FP16修复终极指南&#xff1a;彻底解决显存溢出问题 【免费下载链接】sdxl-vae-fp16-fix 项目地址: https://ai.gitcode.com/hf_mirrors/madebyollin/sdxl-vae-fp16-fix 还在为SDXL推理时的黑色图像困扰&#xff1f;显存占用过高导致无法流畅运行&#xff1f;…

作者头像 李华
网站建设 2026/4/23 13:29:10

Apache Curator终极指南:分布式协调的完整实战教程

Apache Curator终极指南&#xff1a;分布式协调的完整实战教程 【免费下载链接】curator Apache Curator 项目地址: https://gitcode.com/gh_mirrors/curator5/curator 在当今微服务和分布式系统盛行的时代&#xff0c;如何优雅地处理分布式协调问题成为每个开发者必须面…

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

Trae IDE 读取并解析接口文档:trae-swagger-mcp 插件开发分享

trae-swagger-mcp 插件开发分享背景介绍实现效果进阶总结背景 针对 Trae IDE 无法直接解析 JSON 文件、且仅 DouBao 模型支持图片理解的限制&#xff0c;所以开发了本工具 其实上传接口文档的截图&#xff0c;让 AI 解析图片上的内容也十分方便&#xff0c;但是我想要解析完成…

作者头像 李华
网站建设 2026/4/23 13:30:35

超级好用的五款顶尖JSON在线工具

一、为什么JSON工具如此重要&#xff1f; JSON&#xff08;JavaScript Object Notation&#xff09;已成为现代数据交换的通用语言。但你是否曾在面对压缩、无格式化的JSON数据时感到困惑&#xff1f; 专业JSON在线工具能将这种“数据密文”转化为清晰、可读的结构&#xff0…

作者头像 李华