CopyOnWriteArrayList中add有锁了为什么要copy

news2024/12/25 15:17:26

CopyOnWriteArrayList中add有锁了为什么要copy

看之前一定要去看之前juc常用中看下volatile的作用

主要还是看写操作,下面是他的源码

    /**
     * Appends the specified element to the end of this list.
     *
     * @param e element to be appended to this list
     * @return {@code true} (as specified by {@link Collection#add})
     */
    public boolean add(E e) {
        synchronized (lock) {
            Object[] es = getArray();
            int len = es.length;
            es = Arrays.copyOf(es, len + 1);
            es[len] = e;
            setArray(es);
            return true;
        }
    }

疑问点::为什么加锁了还要进行copy操作
在这里插入图片描述

思考::
1、若没有复制,写时加锁,读时不加锁,那么就会发生并发读写问题,产生不可预期的异常,即上面说的 ConcurrentModificationException;
2、若没有复制,写时加锁,读时也需要加锁,这样就相当于退化为 SynchronizedList,读性能大大减弱。

解答::
在这里插入图片描述
先看上述代码中有volatile修饰
那你add了,将指向新的值,其他线程读取出来的也是最新的
由于读没有加锁,而volatile并不保证原子性,写的过程中的数据修改会被其他线程看到。

volatile:
可见性:当一个线程修改一个 volatile 变量的值时,这个新值将立即被写入主内存(Main Memory),并且对其他线程可见。当其他线程读取该 volatile 变量时,它们将会从主内存中读取最新的值,而不是使用线程的本地缓存。

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

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

相关文章

Nagle算法原理与实现详解

文章目录 背景Nagle算法详解算法实现实现开启与关闭Nagle算法 Nagle算法与延迟ACK参考 背景 TCP的数据流大致可以被分成两类: 交互式数据流 TCP交互数据流指的是:TCP连接中传输的所有数据的总和,包括控制命令(用于管理网络中连接…

Lenovo IdeaPad 330-15IKB 81DE电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网,转载需注明出处。(下载请直接百度黑果魏叔) 硬件配置 硬件型号驱动情况 主板Lenovo IdeaPad 330-15IKB 81DE 处理器Intel(R) Core(TM) i3-8130U CPU 2.20GHz (Kaby Lake Refresh)已驱动 内存M471A1G44AB0-CWE * …

jetson nano csi摄像头 tensorrt 运行yolov8检测

jetson nano csi摄像头 tensorrt 运行yolov8检测 1. 在本地电脑训练环境下将onnx模型导出yolov8 导出onnx 模型使用onnxsim优化onnx 模型2. 在jetson nano下 转换到tensorrt模型配置好环境后 使用trtexec 生成engine使用python tensorrt 读取csi摄像头进行预测1. 在本地电脑训练…

AnsiConsole-能够编写 ANSI 转义序列的控制台

Spectre.Console 是一款 .NET 库,提供了一种简单但强大的方式来创建美观和交互式的控制台应用程序。它允许开发人员轻松构建具有颜色、表格、进度条等功能的富命令行界面 (CLI)。 功能 Spectre.Console 的一些显着功能包括: 颜色:Spectre.C…

实时时钟 RTC(2)

RTC 使能与停止 RTC 上电后立即启动,不可关闭,软件应在32K 晶体振荡器完全起振后再设置当前时间;在晶体振荡器起振之前芯片使用内部环振计时,偏差较大。 RTC 时间设置 软件可以在任意时刻直接设置RTC 时间寄存器;由于…

数据结构与算法(八)

二叉搜索树 二叉树:二叉树每个结点最多有两个子树 二叉搜索树: (BST) 其实就是在普通的二叉树上加了一些限制 没有任何限制,二叉搜索树插入子结点的时候有一些特殊的要求 二叉搜索树的性质: 非空左子树所有的键值小于其根结点的键值非空右子树所有的…

Java的Atomic原子类

Java SDK 并发包里提供了丰富的原子类,我们可以将其分为五个类别,这五个类别提供的方法基本上是相似的,并且每个类别都有若干原子类。 对基本数据类型的变量值进行原子更新;对对象变量的指向进行原子更新;对数组里面的…

如何使用 Fail2ban 防止对 Linux 的暴力攻击?

在当今数字化世界中,网络安全成为了一个极其重要的话题。Linux 作为一种广泛使用的操作系统,也面临着各种网络攻击的风险,包括暴力攻击、密码破解和恶意登录等。为了保护 Linux 系统的安全,我们可以使用 Fail2ban 这样的工具来防止…

什么是日志关联

什么是日志关联 日志关联是一种分析来自不同源的日志数据以识别事件模式的技术。它用于更好地了解网络的活动,从而有效地保护网络免受漏洞和威胁。 日志关联是日志管理过程的关键部分。收集和存储日志后,集中式日志服务器将执行分析以检测特定事件。日…

Java Web 编写第一个Servlet程序全过程

一、工具准备 IDEATomcat 二、创建一个名为hello-servlet的maven项目 三、在工程根目录下创建一个web文件夹&#xff0c;web文件夹下创建WEB-INF目录&#xff0c;WEB-INF目录下创建web.xml文件&#xff0c;目录结构以及web.xml文件内容如下&#xff1a; <?xml version&qu…

AcrelEMS-HIM高速公路综合能效系统在新晋高速公路快村营至营盘段项目的应用

​安科瑞 耿敏花 摘 要&#xff1a;我国新型工业化、信息化、城镇化和农业现代化加快发展&#xff0c;经济结构加快转型&#xff0c;交通运输总量将保持较快增长态势&#xff0c;各项事业发展要求提高国家公路网的服务能力和水平。高速公路沿线的收费站、互通枢纽、服务区、隧道…

三年外包的血泪史,终于脱离苦海了~

外包给的不高&#xff0c;是真的不能去呀&#xff01; 先说一下我的个人情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近3年的功能测试点点点&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒…

C# WPF窗体设计器显示以及App.xaml文件打不开(VS 2022)

问题描述&#xff1a; 在项目中遇到了App.xaml设计器打不开以及窗体设计器不显示&#xff0c;只有代码&#xff0c;如图所示&#xff1a; 可以明显的看见左下角的设计器不见&#xff0c;但是用户控件又有设计器 解决方法&#xff1a; (一、App.xaml不能正常打开) ①清理项…

数字孪生智慧工厂可视化分析决策方案,打造智慧汽车工厂

智慧工厂是当前智能制造领域的热门话题之一&#xff0c;是一种集成数字技术、先进制造技术和现代管理技术的新型工厂模式。随着全球制造业的发展&#xff0c;智慧工厂逐渐成为未来工厂发展的一大趋势&#xff0c;越来越多的企业开始关注智慧工厂的建设。 该数字孪生智慧汽车工厂…

vue-cli4+vant+rem+sass+vuex+axios封装+webpack搭建前端项目

移动端项目模板 基于 vue-cli4.0 webpack 4 vant ui sass rem 适配方案axios 封装&#xff0c;构建手机端模板脚手架 启动项目 git clone https://github.com/teach-tian/h5-vue-cli4.gitcd h5-vue-cli4npm installnpm run serve✅ 配置多环境变量 package.json 里的 s…

Stimulsoft报表开发工具支持电子签名啦!一起来看

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

java 注解学习

Java 语言中存在三类注解&#xff0c;分别是元注解&#xff08;Meta-annotations&#xff09;、Java 内置注解&#xff08;Built-in Annotations&#xff09;和自定义注解&#xff08;Custom Annotations&#xff09;。 1、元注解&#xff08;Meta-annotations&#xff09; 元…

Pandas-如何对指定某列的NaN值进行替换或填充

前言 本文是该专栏的第31篇,后面会持续分享python数据分析的干货知识,记得关注。 笔者在本专栏之前有单独详细介绍过,使用Numpy对数组元素进行替换的方法,感兴趣的同学,可翻阅查看“Numpy-如何对数组的元素进行替换”。 而本文来单独介绍pandas对指定列的NaN值进行操作的…

《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序

《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序 题目1题目2题目3题目4题目5题目6总结 题目1 将下面的程序编译、连接&#xff0c;用 Debug 加载、跟踪&#xff0c;然后回答问题 assume cs:code, ds:data, ss:stack data segmentdw 0123h,0456h,0789h,0abch,0def…