CopyOnWriteArrayList 的底层原理与多线程注意事项
文章目录
- CopyOnWriteArrayList 的底层原理与多线程注意事项
- 1. CopyOnWriteArrayList 底层原理
- 1.1 概念说明
- 1.2 实现原理
- 1.3 优点
- 1.4 缺点
- 2. CopyOnWriteArrayList 多线程注意事项与实例
- 2.1 注意事项
- 2.2 示例
- 2.2.1 示例代码
- 3. 总结
CopyOnWriteArrayList 的底层原理与多线程注意事项
1. CopyOnWriteArrayList 底层原理
1.1 概念说明
CopyOnWriteArrayList 是一个线程安全的 List 集合,它采用了读写分离的思想,即在写操作时,先复制当前数组,然后在新数组上进行写操作,最后通过指向新数组的方式完成对象的引用。由于读操作无需加锁,因此读写操作并不冲突。
1.2 实现原理
CopyOnWriteArrayList 底层由数组实现,每次修改都会将原来的数组复制一份,然后对这个新数组进行操作,最后再将原来数组的引用指向新的数组。显然,在写操作时,CopyOnWriteArrayList 基本上需要对整个数组进行复制,所以针对大量修改操作的集合,CopyOnWriteArrayList 性能是比较低的。
1.3 优点
- 线程安全
CopyOnWriteArrayList 是一个线程安全的 List 集合,主要原理就是利用了读写分离的思想,当进行写操作时,会生成一个新的数组,这样可以保证读写操作的互不干扰,从而实现了线程安全。
- 无锁化读操作
CopyOnWriteArrayList 写操作加锁,但是读操作无需加锁,这就大大提高了读操作的效率。
1.4 缺点
- 内存开销
每次写操作都需要复制数据,所以内存开销较大。
- 数据一致性问题
在迭代 CopyOnWriteArrayList 集合时,因为复制数组需要一定的时间,所以如果在迭代过程中对 CopyOnWriteArrayList 集合进行修改,那么有可能出现一些数据不一致的问题,这点需要注意。
2. CopyOnWriteArrayList 多线程注意事项与实例
2.1 注意事项
- 适用场景
CopyOnWriteArrayList 适用于读多写少的场景下,读操作可以无锁地进行,非常适合读写比例相差很大的场景。
- 并发问题
由于 CopyOnWriteArrayList 写操作需要复制整个数组,因此很耗费内存资源。当集合数据较大时,可能会对内存造成很大压力。考虑到性能与资源消耗之间的平衡,我们需要根据实际业务需求,选择合适的集合类型。
- 数据一致性问题
尽管 CopyOnWriteArrayList 是一个线程安全的集合,但是在迭代时可能会存在数据不一致的问题,因此,建议在迭代过程中尽量避免对集合进行修改操作,或者使用迭代器的 remove() 方法进行操作。
2.2 示例
下面我们来看一下 CopyOnWriteArrayList 的使用示例。
2.2.1 示例代码
import java.util.concurrent.CopyOnWriteArrayList;public class MyDemo {public static void main(String[] args) {CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();Thread t1 = new Thread(() -> {for (int i = 0; i < 10; i++) {list.add(Thread.currentThread().getName() + " - " + i);}}, "Thread1");Thread t2 = new Thread(() -> {for (int i = 0; i < 10; i++) {list.add(Thread.currentThread().getName() + " - " + i);}}, "Thread2");// 启动线程t1.start();t2.start();// 等待线程执行完成try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}// 输出结果for (String str : list) {System.out.println(str);}}
}
3. 总结
CopyOnWriteArrayList 是 Java 集合框架中非常实用的线程安全 List 集合,通过读写分离的思想,保证了在高并发读多写少的情况下的数据安全和性能。但是,由于每次写操作需要复制整个数组,所以对内存的消耗较大,同时在迭代过程中也可能会存在一些数据不一致的问题。因此,在使用 CopyOnWriteArrayList 时,需要根据实际业务需求选择合适的集合类型,避免出现不必要的问题。
相关文章:
CopyOnWriteArrayList 的底层原理与多线程注意事项
文章目录 CopyOnWriteArrayList 的底层原理与多线程注意事项1. CopyOnWriteArrayList 底层原理1.1 概念说明1.2 实现原理1.3 优点1.4 缺点 2. CopyOnWriteArrayList 多线程注意事项与实例2.1 注意事项2.2 示例2.2.1 示例代码 3. 总结 CopyOnWriteArrayList 的底层原理与多线程注…...
互斥锁深度理解与使用
大家好,我是易安! 我们知道一个或者多个操作在CPU执行的过程中不被中断的特性,称为“原子性”。理解这个特性有助于你分析并发编程Bug出现的原因,例如利用它可以分析出long型变量在32位机器上读写可能出现的诡异Bug,明明已经把变量…...
Elasticsearch --- 数据聚合、自动补全
一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这…...
Haproxy搭建web群集
一.常见的web集群调度器 1、目前常见的web集群调度器分为软件和硬件 2、软件通常使用开源的LVS、Haproxy、Nginx LVS 性能最好,但搭建复杂。Nginx并发量,性能低于Haproxy 3、硬件一般使用比较多的是F5,也有很多人使用国内的一些产品&a…...
Packet Tracer - 配置和验证小型网络
Packet Tracer - 配置和验证小型网络 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 RTA G0/0 10.10.10.1 255.255.255.0 不适用 G0/1 10.10.20.1 255.255.255.0 不适用 SW1 VLAN1 10.10.10.2 255.255.255.0 10.10.10.1 SW2 VLAN1 10.10.20.2 255.25…...
Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机设备的各种固件信息如DeviceID或者SerialNumber等(C++)
项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具…...
java 的参数传递
一、疑惑引入 首先,我们从一个例子来引出这个问题: public static void main(String[] args) throws IOException {List<String> mockList Lists.newArrayList("a", "b");System.out.println("1: " mockList);L…...
【面试长文】HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异
文章目录 HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异HashMap的数据结构和原理JDK1.6、1.7和1.8中的HashMap源码演变JDK1.6JDK1.7JDK1.8 总结自己实现一个简单的HashMapHashMap的时间复杂度分析HashMap的空间复杂度分析HashMap的应用场景HashMap的弊端及解…...
【25】linux进阶——网络文件系统NFS
大家好,这里是天亮之前ict,本人网络工程大三在读小学生,拥有锐捷的ie和红帽的ce认证。每天更新一个linux进阶的小知识,希望能提高自己的技术的同时,也可以帮助到大家 另外其它专栏请关注: 锐捷数通实验&…...
JAVA入坑之JAVADOC(Java API 文档生成器)与快速生成
目录 一、JAVADOC(Java API 文档生成器) 1.1概述 1.2Javadoc标签 1.3Javadoc命令 1.4用idea自带工具生成API帮助文档 二、IDEA如何生成get和set方法 三、常见快捷方式 3.1快速生成main函数 3.2快速生成println()语句 3.3快速生成for循环 3.4“…...
React | React组件化开发
✨ 个人主页:CoderHing 🖥️ React .js专栏:React .js React组件化开发 🙋♂️ 个人简介:一个不甘平庸的平凡人🍬 💫 系列专栏:吊打面试官系列 16天学会Vue 11天学会React Node…...
云计算的优势与未来发展趋势
一、前言二、云计算的基础概念2.1 云计算的定义2.2 云计算的发展历程2.3 云计算的基本架构2.4 云计算的主要服务模式 三、企业采用云计算的优势3.1 降低成本3.2 提高效率和灵活性3.3 提升信息系统的安全性和可靠性3.4 拥有更加丰富的应用和服务 四、行业应用案例4.1 金融行业4.…...
shell编程lesson01
命令行和脚本关系 命令行:单一shell命令,命令行中编写与执行; 脚本:众多shell命令组合成一个完成特定功能的程序,在脚本文件中进行编写维护。 脚本是一个文件,一个包含有一组命令的文件。 编写一个shel…...
看看人家的MyBatis批量插入数据优化,从120s到2.5s,那叫一个优雅!
粗略的实验 最后 最近在压测一批接口的时候,我发现接口处理速度比我们预期的要慢。这让我感到有点奇怪,因为我们之前已经对这些接口进行了优化。但是,当我们进行排查时,发现问题出在数据库批量保存这块。 我们的项目使用了 myb…...
软件和信息服务业专题讲座
软件和信息服务业专题讲座 单选题(共 10 题,每题 3 分) 1、根据本讲,我国要加强物联网应用领域()开发和应用。 A、大数据 2、根据本讲,要充分发挥软件对城市管理和惠民服务的(&am…...
由 ChatGPT 团队开发,堪称辅助神器!IntelliJ IDEA 神级插件
什么是Bito? 为什么要使用Bito? 如何安装Bito插件 如何使用Bito插件 什么是Bito? Bito是一款由ChatGPT团队开发的IntelliJ IDEA编辑器插件,旨在提高开发人员的工作效率。此插件强大之处在于它不仅可以帮助开发人员更快地提交…...
spass modeler
课时1:SPSS Modeler 简介 本课时一共分为五个模块,分别是Modeler概述、工具安装、窗口说明以及功能介绍和应用案例。相信通过本课时内容的学习,大家将会对SPSS Modeler有个基础的了解. 在学习本节课内容之前,先来看看本节课我们究…...
kafka的push、pull分别有什么优缺点
文章目录 kafka的push、pull分别有什么优缺点Push 模式优点缺点 Pull 模式优点缺点 实践操作 kafka的push、pull分别有什么优缺点 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,广泛应用于各大互联网公司的消息系统中。在 Kafka 中,生产者使用…...
【Canvas入门】从零开始在Canvas上绘制简单的动画
这篇文章是观看HTML5 Canvas Tutorials for Beginners教程做的记录,所以代码和最后的效果比较相似,教程的内容主要关于这四个部分: 创建并设置尺寸添加元素让元素动起来与元素交互 设置Canvas的大小 获取到canvas并设置尺寸为当前窗口的大…...
【技术整合】各技术解决方案与对应解决的问题
文章目录 基本实现性能安全 本文将框架分为三大类: 基本实现:包括某个供能或者提供web、移动端、桌面端、或者上述端上的某种功能性能:提升高可用、高并发的框架安全:包括网络安全、权限与容灾等 基本实现 .NET CORE、.NET web基…...
公网远程访问公司内网象过河ERP系统「内网穿透」
文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻,不管是财务、生产、销售还是采购,都需要用到ERP系统来协助。…...
Win11的两个实用技巧系列之修改c盘大小方法、功能快捷键大全
Win11 c盘无法更改大小什么原因?Win11修改c盘大小方法 有不少朋友反应Win11 c盘无法更改大小是怎么回事?本文就为大家带来了详细的更改方法,需要的朋友一起看看吧 Win11 c卷无法更改大小什么原因?有用户电脑的系统盘空间太小了,…...
离散数学下--- 代数系统
代数系统 定义: 代数系统是用代数运算构造数学模型的方法。 • 通过构造手段生成,所以也称代数结构 • 代数运算:在集合上建立满足一定规则的运算系统 (一)二元运算 二元运算的定义 二元运算需要满足的两个条件&a…...
java基础入门-04
Java基础入门-04 11、集合&学生管理系统11.1.ArrayList集合和数组的优势对比:11.1.1 ArrayList类概述11.1.2 ArrayList类常用方法11.1.2.1 构造方法11.1.2.2 成员方法11.1.2.3 示例代码 11.1.3 ArrayList存储字符串并遍历11.1.3.1 案例需求11.1.3.2 代码实现 11…...
《面试1v1》java反射
我是 javapub,一名 Markdown 程序员从👨💻,八股文种子选手。 面试官: 你好,请问你对 Java 反射有了解吗? 候选人: 是的,我了解一些。 面试官: 那你能简单…...
【C语言】struct结构体
文章目录 一. 结构体简述二. 结构体的声明和定义1、简单地声明一个结构体和定义结构体变量2、声明结构体的同时也定义结构体变量3、匿名结构体4、配合typedef,声明结构体的同时为结构体取别名5、在声明匿名结构体时,使用typedef给这个匿名结构体取别名 三…...
Docker代码环境打包
1. 介绍 Docker是一种开源的容器化平台,它可以在操作系统级别运行应用程序。通过将应用程序及其依赖项封装成一个可移植的容器,Docker使得应用程序可以在任何环境中轻松部署、运行和管理。使用Docker,开发人员可以避免在不同环境中出现的配置…...
现代CMake高级教程 - 第 6 章:输出与变量
双笙子佯谬老师的【公开课】现代CMake高级教程课程笔记 第 6 章:输出与变量 在运行 cmake -B build 时,打印字符串(用于调试) message("Hello world!")❯ cmake --build buildHello world! -- Configuring done -- G…...
windows/linux文件传输
windows系统下文件传输-FTP python安装pyftpdlib模块 pip install pyftpdlib 这里可能会出现报错,自己看着更换源解决 然后运行python,在2121端口监听 python -m pyftpdlib 然后我们可以使用windows命令行进行操作,自己可以去看下相关文…...
Anoconda安装笔记+win10 更改中文用户名为英文
win10 更改中文用户名为英文 ① WinR打开命令窗口,输入regedit 打开注册表, 手动找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList 在这个目录下面有几个S-1-5-的项,挨个检查每一项, 找到“…...
慈溪做网站哪家好/百度一下你就知道了官网
ios获取服务器数据 内容精选换一换该任务指导用户使用Loader将数据从SFTP服务器导入到HBase。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HBase表或phoenix表。获取SFTP服务器使用的用户和密码,且该用户具备SFTP服务器上…...
网站建设要学编程吗/北京优化核酸检测
(本文略长,8000余字,大约需要花费10分钟,但值得你认真读完)“快十年了,我们很多人心里是憋着一股气的。”丛真作为盛斗士的代表,在美国盛大公司办公室里,终于有机会当面对陈天桥表达…...
怎么做电子商务网站/seo sem关键词优化
2. 数据类型 2.1. KingbaseES数据类型到Oracle数据类型转换 表 2.1.2 KingbaseES数据类型到Oracle数据类型转换序号 KingbaseES 数据类型 Oracle数据类型 备注说明 (KingbaseES) 数值型 1 tinyint NUMBER 单字节整数 -128 to 127 2 smallint …...
国外有哪些网站做推广的比较好/百度人工客服电话24小时
ESMap-Indoor-navigation ESMapHtml5SpringBootFastDFS实现导航导购Appgithub链接:https://github.com/ShimmerPig... 项目实现的简要概述 服务器部分 测试阶段使用的是双系统的开发模式,在Linux服务器上部署了轻量级分布式文件系统fastdfs,且…...
广东网站设计推荐/百度推广竞价技巧
Java语言程序设计_基础篇_中文ppt_第四章Liang, Introduction to Java Programming, Eighth Edition, (c) 2011 Pearson Education, Inc. All rights reserved. 0132130807 第4章 循 环 引言 假设你需要打印一个字符串 (例如: “Welcome to Java!”)100次。这就需要…...
做网站加一个定位功能要多少钱/百度seo收费
备份需求和rman备份 oracle数据库的备份相关问答: 1)备份时数据库处于何种状态? 备份时数据库处于OPEN状态,这样数据库可以正常工作。 2)备份的数据备份在什么地方? 备份在本地磁盘。 3)备份的存…...