面试:CopyOnWriteArrayList

问题:

ArrayList 是线程不安全的,同一时间写和读会造成线程不安全,怎么解决呢?

答:可以使用CopyOnWriteList。

CopyOnWriteList特点

  1. CopyOnWriteArrayList是Java中的一种并发集合类,它实现了List接口,并且是线程安全的。它的特点是在进行写操作时,会创建一个新的副本来进行操作,而不是直接修改原有的集合。

  2. CopyOnWriteArrayList的实现机制是在写操作时,先将原有的集合进行复制,然后对新的副本进行修改操作,最后将修改后的副本替换原有的集合。这样可以保证在写操作时不会影响到正在进行读操作的线程,保证了读写的并发性。

  3. 由于每次写操作都会复制整个集合,所以CopyOnWriteArrayList的写操作性能较低,适用于读操作较多而写操作较少的场景。它适合用于一些读多写少的并发场景,比如缓存、观察者模式等。

  4. 需要注意的是,CopyOnWriteArrayList虽然是线程安全的,但是它的迭代器并不支持修改操作,如果需要对集合进行修改,需要使用特殊的方法来操作。此外,由于每次写操作都会创建一个新的副本,所以CopyOnWriteArrayList占用的内存较大,需要根据具体场景进行权衡。

核心原理

主要是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();}}

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

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

相关文章

【C++11新特性】lambda表达式和应用场景

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

【过生日,函数运用,找闰年】

小明出生在一个闰年&#xff0c;他想知道什么时候可以过生日&#xff0c;你能告诉他吗&#xff1f; 给你一个正整数Y&#xff0c;表示起始年份&#xff0c;和一个正整数N&#xff0c;你的任务是告诉小明从Y年开始第N个闰年是哪一年。 注意&#xff1a;如果Y就是闰年&#xff0c…

力扣每日一题112:路径总和

题目 简单 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是…

java入门1.1.1版本

前言&#xff1a; 上面的内容是1.0.0~1.1的内容总结 秉持着先做再定义的理念&#xff0c;这里会带着大家先体验一下类与对象 第一步&#xff1a;新建一个java文件 鼠标右键 → 新建 → 文本文档 → 右键 → 点击重名 → 全选 → hello.java 第二步&#xff1a;用笔记本打开 …

Java 面试题整理

Java 基础 Java 自动装箱、拆箱(编译器自动处理) 装箱: Jdk1.5 之后提供的功能、将包装类型自动转换为基本数据类型拆箱: Jdk1.5 之后提供的功能、将基本数据类型自动转换为包装类型 Jdk 与 Jre 的 区别 Jdk 是 Java 开发工具、包含了Jre 和 开发工具包JRE 是 Java 运行时环境 …

C++进阶:map与set简单自实现

目录 1. map与set封装红黑树的方式1.1 大概实现思路1.2 红黑树模板抽象1.3 红黑树的迭代器 2. 红黑树模板的实现2.1 结点结构的定义2.2 红黑树迭代器的实现2.2.1 迭代器的结构2.2.2 迭代器的方法实现 2.3 树结构的定义2.4 红黑树接口实现2.4.1 插入2.4.2 查找2.4.3 迭代器相关 …

pytest + yaml 框架 - 参数化读取文件路径优化

针对小伙伴提出参数化时读取外部文件&#xff0c;在项目根路径运行没问题&#xff0c;但是进入到项目下子文件夹运行用例&#xff0c;就会找不到文件问题做了优化。 关于参数化读取外部文件相关内容参考前面这篇pytest yaml 框架 -25.参数化数据支持读取外部文件txt/csv/json/…

随手笔记-GNN(朴素图神经网络)

自己看代码随手写的一点备忘录&#xff0c;自己看的&#xff0c;不喜勿喷 GNN (《------ 代码) 刚开始我还在怀疑为什么没有加weigth bias&#xff0c;已经为什么权重才两个&#xff0c;原来是对node_feats进行的network的传播&#xff0c;而且自己内部直接进行了。 下面是一…

【api接口开通教程】YouTube Data API v3申请流程

一、背景调查 1.1 API接口介绍 采集youtube数据&#xff0c;大体分为两种方案&#xff1a;一种是基于爬虫&#xff0c;一种是基于API接口。 说人话就是&#xff1a;爬虫相当于走后门、爬窗户&#xff08;利用技术手段窃取&#xff0c;人家没说给&#xff0c;但我硬拿&#x…

ssrf漏洞学习——基础知识

一、SSRF是什么&#xff1f; SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。 一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能…

java项目-导入https证书三种方式

1、导入证书到jdk&#xff08;linux虚拟机过程类似&#xff09; 1.1 确认jre的目录&#xff0c;通过查看path环境变量&#xff0c;查看JAVA_HOME %JAVA_HOME\jre\lib\security\目录即为keytool证书路径 1.2 安装证书到jre的路径 进入到jre路径 cd C:\Program Files\Java\jdk…

leetcode每日一题第七十二天

class Solution { public:TreeNode* searchBST(TreeNode* root, int val) {if(!root) return root;if(root->val val) return root;else if(root->val > val) return searchBST(root->left,val);else return searchBST(root->right,val);} };

日志打印传值 传引用 右值引用性能测试(Linux/QNX)

结论 Linux平台和qnx平台优化后传值性能都是比传引用的差&#xff0c;也比传右值的差&#xff0c;因此传参时有必要传递引用。 测试代码 #include <cstdint> #include <ctime> #include <string>#ifdef __linux__#define ITERATIONS 10000000 #else#defin…

(七)JSP教程——session对象

浏览器和Web服务器之间的交互通过HTTP协议来完成&#xff0c;HTTP协议是一种无状态的协议&#xff0c;服务器端无法保留浏览器每次与服务器的连接信息&#xff0c;无法判断每次连接的是否为同一客户端。为了让服务器端记住客户端的连接信息&#xff0c;可以使用session对象来记…

STM32--4G DTU 及 阿里云

模块概述 ATK-IDM750C/IDM751C 是正点原子(ALIENTEK)团队开发的一款高性能 4G Cat1 DTU 产品&#xff0c; 支持移动 4G、联通 4G 和电信 4G 手机卡。它以高速率、低延迟和无线数传作为核心功能&#xff0c; 可快速解决应用场景下的无线数传方案。 它支持 TCP/UDP/HTTP/MQTT/DN…

Scala基础学习-循环

一、流程控制 循环结构、选择结构、循环结构 1、循环结构 从上至下&#xff0c;从左至右&#xff0c;依次执行&#xff0c;系统默认结构 2.选择结构 分类&#xff1a;单分支、双分支、多分支 (1)、单分支 object xuexi {def main(args: Array[String]): Unit {val a 20…

【Python】JSON数据的使用

一、JSON JSON是什么&#xff1a; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它以易于理解和生成的文本格式来描述数据对象。JSON最初是由Douglas Crockford在2001年提出的&#xff0c;它的设计受到了JavaScript对象字面量…

系统安全:物联网安全面试

文章目录 岗位要求 岗位要求

kafka(七)——消息偏移(消费者)

概念 消费者消费完消息后&#xff0c;向_consumer_offset主题发送消息&#xff0c;用来保存每个分区的偏移量。 流程说明 consumer发送JoinGroup请求&#xff1b;coordinator选出一个consumer作为leader&#xff0c;并将topics发送给leader消费者&#xff1b;leader consumer…

const修饰的成员函数

欢迎来到博主的专栏——C杂谈 博主ID&#xff1a;代码小豪 文章目录 const修饰了什么const修饰的成员函数是为什么&#xff1f;问答环节 const修饰的成员函数并非是在返回值类型用const&#xff0c;而是在成员函数的末尾加上const&#xff0c;比如&#xff1a; const char&…