news 2026/8/12 15:07:48

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/8/12 11:17:19

京东Java面试被问:ZGC的染色指针如何实现?内存屏障如何处理?

1. 传统GC的内存管理问题text传统GC标记对象方式&#xff1a; [对象头] [标记位] → 需要修改对象内存 问题&#xff1a;标记阶段需要STW&#xff0c;大堆停顿时间长2. ZGC的核心创新&#xff1a;元数据外置textZGC方案&#xff1a; [对象指针] [元数据标记] → 不修改对象本…

作者头像 李华
网站建设 2026/8/12 12:56:18

硬件 - 高速协议设计整合

目录 1.DDR 1.1 DDR设计规范概览 1.2 DDR PCB Layout要求 ​​​​​​​ 1.3 设计审批流程 ​​​​​​​ 1.4 常见错误以及防范 ------------------------------------------------------------------------------------------------------------------------ 2.…

作者头像 李华
网站建设 2026/8/12 11:13:11

Vue3如何设计百万文件上传的进度监控界面?

天津XX软件公司大文件传输系统前端技术方案&#xff08;第一人称视角&#xff09; 一、技术选型与架构设计 作为前端负责人&#xff0c;我主导了基于Vue3 TypeScript的模块化架构设计&#xff0c;核心解决以下痛点&#xff1a; 浏览器兼容性&#xff1a;通过分层适配策略覆…

作者头像 李华
网站建设 2026/8/12 12:15:06

Steamless终极指南:深度解析DRM移除技术与多场景应用

Steamless终极指南&#xff1a;深度解析DRM移除技术与多场景应用 【免费下载链接】Steamless Steamless is a DRM remover of the SteamStub variants. The goal of Steamless is to make a single solution for unpacking all Steam DRM-packed files. Steamless aims to supp…

作者头像 李华
网站建设 2026/8/11 14:17:25

如何在消费级显卡上运行Llama-Factory进行模型微调?

如何在消费级显卡上运行 Llama-Factory 进行模型微调&#xff1f; 在大模型时代&#xff0c;训练一个像 LLaMA-2 或 Qwen 这样的 70 亿参数语言模型&#xff0c;听起来像是只有科技巨头才能负担的“重工业”项目。动辄上百 GB 显存、多卡 A100 集群、数万美元的云成本——这些门…

作者头像 李华