Java高频面试之集合-08

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:详细说说CopyOnWriteArrayList


CopyOnWriteArrayList 详解

CopyOnWriteArrayList 是 Java 并发包(java.util.concurrent)中提供的线程安全列表,基于“写时复制”(Copy-On-Write)机制实现。它适用于读多写少的高并发场景,如事件监听器列表、配置管理等。


核心特性
特性说明
线程安全读操作无锁,写操作通过锁保证线程安全。
数据一致性读操作基于快照,迭代期间不会抛出 ConcurrentModificationException
写开销每次修改操作会复制底层数组,内存占用较高。
适用场景读操作频繁,写操作极少(如监听器管理、配置存储)。

底层实现
  1. 数据结构

    • 基于动态数组(volatile Object[] array)存储数据。
    • 所有读操作直接访问当前数组,无需同步。
  2. 写时复制(COW)

    • 修改操作流程
      1. 加锁(ReentrantLock)。
      2. 复制原数组,生成新数组。
      3. 在新数组上执行修改操作。
      4. 将底层数组引用指向新数组(setArray(newArray))。
      5. 释放锁。
    • 代码示例(add 方法)
      public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;Object[] newElements = Arrays.copyOf(elements, len + 1);newElements[len] = e;setArray(newElements);return true;} finally {lock.unlock();}
      }
      
  3. 迭代器

    • 基于迭代器创建时的数组快照遍历数据。
    • 不支持修改操作(如 removeset),调用会抛出 UnsupportedOperationException
    • 代码示例
      public Iterator<E> iterator() {return new COWIterator<E>(getArray(), 0);
      }
      

优点与缺点
优点缺点
读操作无锁,性能极高。写操作内存开销大(复制全量数据)。
避免并发修改异常(ConcurrentModificationException)。数据弱一致性(读操作可能不反映最新状态)。
实现简单,适合读多写少场景。写操作频繁时性能急剧下降。

适用场景
  1. 监听器列表
    如 GUI 事件监听器,注册后极少修改,但频繁触发事件(读)。

    // 添加监听器(写操作少)
    listeners.add(new Listener());// 触发事件(读操作多)
    for (Listener listener : listeners) {listener.onEvent();
    }
    
  2. 配置管理
    系统配置通常加载后很少修改,但频繁读取。

    CopyOnWriteArrayList<Config> configs = loadConfigs();
    // 读取配置(无锁)
    String value = configs.get(0).getProperty("key");
    
  3. 缓存快照
    需要缓存某个时间点的数据快照供查询。


性能对比
操作ArrayListCopyOnWriteArrayListCollections.synchronizedList
读(单线程)O(1)(最快)O(1)(无锁,快)O(1)(同步开销,较慢)
读(高并发)非线程安全,需外部同步O(1)(无锁,最快)O(1)(同步开销,慢)
写(单线程)O(1)(快)O(n)(复制数组,慢)O(1)(同步开销,较慢)
写(高并发)非线程安全O(n)(锁竞争,最慢)O(1)(同步开销,慢)

注意事项
  1. 避免频繁写操作
    批量写入时,优先使用 addAll 代替多次 add,减少数组复制次数。

    // 不推荐
    for (String item : items) {list.add(item);
    }// 推荐
    list.addAll(items);
    
  2. 迭代器弱一致性
    迭代器遍历的是创建时的快照,可能无法感知后续修改。

    CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(Arrays.asList(1, 2, 3));
    Iterator<Integer> it = list.iterator();
    list.add(4);
    while (it.hasNext()) {System.out.print(it.next()); // 输出 1,2,3(不包含4)
    }
    
  3. 内存监控
    大对象或超大数组可能导致内存压力,需监控堆内存使用。


🐮🐎
  • 使用场景:读多写少,允许数据弱一致性。
  • 替代方案
    • 写多读少:考虑 ConcurrentLinkedQueueConcurrentHashMap
    • 强一致性需求:使用锁或 synchronizedList
  • 最佳实践:结合业务特点选择数据结构,必要时进行性能压测。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/71900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【微信小程序 onTabItemTap:精准监听 TabBar 点击事件】

onTabItemTap 是微信小程序中的一个页面生命周期函数&#xff0c;用于监听用户点击 TabBar 上的某个项时的事件。以下是如何运用 onTabItemTap 的详细说明&#xff1a; 使用场景 onTabItemTap 适用于需要在用户点击 TabBar 切换页面时执行特定逻辑的场景。例如&#xff0c;你…

痉挛性斜颈需要做手术吗?

痉挛性斜颈的治疗是一个涉及多种医学知识的话题&#xff0c;让我们从多方面分析这个问题&#xff0c;来谈谈是否需要进行手术。 首先&#xff0c;我们要明确痉挛性斜颈是一种什么疾病。痉挛性斜颈是一种颈部肌肉异常收缩的疾病&#xff0c;可能导致头部持续或间歇性地向一侧旋…

AOT是什么?

https://www.bilibili.com/video/BV1Es4y1q7Bf?spm_id_from333.788.player.switch&vd_source12d5954938d20d50645e227a6a728c76&p87常规的java代码是即时解释执行的&#xff0c;只有热点代码才会提前编译成二进制&#xff0c;并且将java代码放到别的电脑执行时得安装j…

【JavaWeb学习Day23】

Maven高级 分模块设计与开发 分模块设计&#xff1a;将一个大项目分成若干个子模块&#xff0c;方便项目的维护、扩展&#xff0c;也方便模块间的相互引用&#xff0c;资源共享。 策略&#xff1a; 1.策略一&#xff1a;按照功能模块拆分&#xff0c;比如&#xff1a;公共组…

图像的特征

图像的特征主要包括以下几类&#xff1a; 1. 颜色特征&#xff1a; 直方图&#xff1a;描述图像中颜色的分布。 颜色矩&#xff1a;通过颜色的均值、方差等统计量表示颜色分布。 主色调&#xff1a;图像中占主导地位的颜色。 2. 纹理特征&#xff1a; 灰度共生矩阵&#xff0…

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐

⭐LeetCode周赛 3468. 可行数组的数目——暴力与数学⭐ 示例 1&#xff1a; 输入&#xff1a;original [1,2,3,4], bounds [[1,2],[2,3],[3,4],[4,5]] 输出&#xff1a;2 解释&#xff1a; 可能的数组为&#xff1a; [1, 2, 3, 4] [2, 3, 4, 5] 示例 2&#xff1a; 输入&…

AF3 squeeze_features函数解读

AlphaFold3 data_transforms 模块的 squeeze_features 函数的作用去除 蛋白质特征张量中不必要的单维度&#xff08;singleton dimensions&#xff09;和重复维度&#xff0c;以使其适配 AlphaFold3 预期的输入格式。 源代码&#xff1a; def squeeze_features(protein):&qu…

【打卡d4】日期类--分组输入

第一题&#xff1a;根据一年中的第 n 天计算日期 &#x1f4cc; 知识点 判断闰年&#xff1a; 闰年条件&#xff1a;能被 400 整除&#xff0c;或 能被 4 整除但不能被 100 整除。平年&#xff1a;2 月 28 天&#xff1b;闰年&#xff1a;2 月 29 天。 累加月份&#xff0c;找…

JAVA(5)-基础概念

*固定格式 一.注释和关键字 关键字&#xff1a;被赋予特定关系的词 字母全部小写&#xff0c;如class表示一个类 二.字面量 1.字面量类型 *字符串里面的类型是一句话&#xff0c;用双引号 字符里面的类型只有一个字或字母 null只能用字符串的方式打印 2.制表符 \t 至少补…

本地部署Navidrome个人云音乐平台随时随地畅听本地音乐文件

文章目录 前言1. 安装Docker2. 创建并启动Navidrome容器3. 公网远程访问本地Navidrome3.1 内网穿透工具安装3.2 创建远程连接公网地址3.3 使用固定公网地址远程访问 前言 今天我要给大家安利一个超酷的私有化音乐神器——Navidrome&#xff01;它不仅让你随时随地畅享本地音乐…

C++ 中的RAII(资源获取及初始化)

C 中的RAII(资源获取即初始化) RAII&#xff08;Resource Acquisition Is Initialization&#xff09;是C中一种重要的编程范式&#xff0c;全称为“资源获取即初始化”。它是一种通过对象生命周期管理资源&#xff08;如内存、文件句柄、网络连接等&#xff09;的技术&#x…

蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 ADC模块1.3.3 IIC模块1.3.4 UART模块1.3.5 LCD模块1.3.6 LED模块1.3.7 TIM模块 2.源码3.第七届题目 前言&#xff1a;STM32G431RBT6实现嵌入式组第七届题目解析源码&…

DeepSeek技术名词全解析:一场属于中国AI的“觉醒时刻”

在2025年的人工智能浪潮中&#xff0c;一个名为DeepSeek的中国团队&#xff0c;用一系列技术突破改写了全球AI竞争的叙事。从“顿悟时刻”到“群体策略优化”&#xff0c;从“冷启动”到“长链思考”&#xff0c;这些晦涩的技术术语背后&#xff0c;是一场关乎人类智能边界的革…

【Go语言圣经1.1】

目标 学习Go 的编译方式、包的组织方式以及工具链的统一调用方式 概念与定义 package Go 语言通过包来组织代码。包类似于其它语言的库librarries或模块modules&#xff0c;每个包通常对应一个目录&#xff0c;目录中的所有 .go 文件都属于同一个包。特殊的 main 包 : 当代码…

主流大语言模型中Token的生成过程本质是串行的

主流大语言模型中Token的生成过程本质是串行的 flyfish 1. 串行生成 自回归模型的核心逻辑&#xff1a; 大模型&#xff08;如GPT-2&#xff09;采用自回归架构&#xff0c;每个Token的生成必须基于已生成的完整历史序列。例如&#xff0c;生成“今天天气很好”时&#xff1a…

基于PySide6的CATIA零件自动化着色工具开发实践

引言 在汽车及航空制造领域&#xff0c;CATIA作为核心的CAD设计软件&#xff0c;其二次开发能力对提升设计效率具有重要意义。本文介绍一种基于Python的CATIA零件着色工具开发方案&#xff0c;通过PySide6实现GUI交互&#xff0c;结合COM接口操作实现零件着色自动化。该方案成…

Python——计算机网络

一.ip 1.ip的定义 IP是“Internet Protocol”的缩写&#xff0c;即“互联网协议”。它是用于计算机网络通信的基础协议之一&#xff0c;属于TCP/IP协议族中的网络层协议。IP协议的主要功能是负责将数据包从源主机传输到目标主机&#xff0c;并确保数据能够在复杂的网络环境中正…

Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF

基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

xunruicms失败次数已达到5次,已被禁止登录怎么处理?

针对遇到的“xunruicms失败次数已达到5次&#xff0c;已被禁止登录”的问题以下是几种处理方法&#xff1a; 开启开发者模式&#xff1a; 您可以开启开发者模式来忽略账号的禁止登录限制。具体操作步骤如下&#xff1a; 访问迅睿CMS的官方文档&#xff0c;找到如何开启开发者模…

复现 MODEST 机器人抓取透明物体 单目 ICRA 2025

MODEST 单目透明物体抓取算法&#xff0c;来自ICRA 2025&#xff0c;本文分享它的复现过程。 输入单个视角的RGB图像&#xff0c;模型需要同时处理深度和分割任务&#xff0c;输出透明物体的分割结果和场景深度预测。 论文地址&#xff1a;Monocular Depth Estimation and Se…