【面试题】我们知道ArrayList是线程不安全,请编写一个不安全的案例并给出解决方案。

news/2024/5/4 11:58:19/文章来源:https://blog.csdn.net/weixin_44460896/article/details/126983668

(一)、不安全的案例(待补充):
(二)解决方案一:使用CopyOnWriteArrayList代替ArrayList
(1)如下面三张图ArrayList底层其实是一个数组
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

(2)CopyOnWriteArrayList底层数组是用volatile 和 transient修饰的。

private transient volatile Object[] array;

volatile 其中一个作用就是线程的可见性,当一个线程修改一个共享变量时,另外一个线程能立即读到这个修改的值。
(3)分析CopyOnWriteArrayList的add方法源码
在这里插入图片描述

①本质还是用到了锁。
②Object[] elements = getArray();就是获取到底层的数组
点进去看getArray()
在这里插入图片描述

③int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
创建一个新的数组,元素为老数组,长度为老数组+1

关于Arrays的copyOfcopyOf(T[] original, int newLength)
Arrays的copyOf()方法传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。
copyOf()的第一个参数是旧的数组,第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值
④newElements[len] = e;
将add方法的参数放倒数组最后一位(本来新数组也就比旧数组长一位)
⑤setArray(newElements); 将新数组赋值给底层数组
在这里插入图片描述

(4)分析CopyOnWriteArrayList的get方法源码
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

可以看到没有锁的存在。
(5)add 方法执行到setArray(newElements)一个注意点(一个介绍视频中说的)
由于数组是volatile,所以更新之后读线程立马可以读到最新数据,但是由于还没有到释放锁的代码,所以此时其他线程不能更新数据。
(6)CopyOnWriteArrayList设计上的优点
对CopyOnWriteArrayList是读写分离的思想,我们刚才看底层也看到读写的其实是不同的数组。
(7)我有一个问题CopyOnWriteArrayList与Collections.synchronizedList有什么区别,对于此问题找到一个【CopyOnWriteArrayList与Collections.synchronizedList的性能对比】博客还没看。链接贴在下面。
https://blog.csdn.net/yangzl2008/article/details/39456817

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

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

相关文章

计算机毕业设计开题报告基于ssm maven健身房俱乐部管理系统

🍅文末获取联系🍅 目录 一、项目介绍 二、开题报告 三、截图 四、源码获取 一、项目介绍 基于ssm的健身房管理系统-计算机毕设java毕业设计项目源码-可定制-IT实战课堂_哔哩哔哩_bilibili项目资料网址: http://www.itszkt.com毕业设计课程设计项目…

item_get商品详情代码展示

1、API 是什么? API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理…

Aip接口自动化测试框架pytest+allure+request+jsonpath+excle

Aip接口自动化测试框架pytestallurerequestjsonpathexcle 介绍 Aip接口自动化测试pythonpytestallurerequestjsonpathexcle,一个支持仅编辑Excle就可实现的接口自动化测试框架。 1.编辑Excle做接口数据驱动的数据源 2.接口上下游数据依赖处理 3.Excel执行函数获取…

对集合、复杂度以及泛型的认识

文章目录 一、集合框架是什么?二、复杂度 1.时间复杂度2.空间复杂度三、泛型一、集合框架是什么? Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 …

linux使用nginx-gridfs实现文件服务

一:nginx第三方模块用什么命令,--addmongodb 二:怎么样装mongodb 三:怎么上传一个图片 四:怎么样去访问这个图片 三方模块;它不是nginx的,就是在源码包编译nginx的时候,把第三方…

IJCAI 2022 | 使用陈述句进行视觉问答的Prompt Tuning

©PaperWeekly 原创 作者 | 武祥宇单位 | 南京理工大学博士生研究方向 | 多模态学习论文标题:Declaration-based Prompt Tuning for Visual Question Answering收录会议:IJCAI 2022论文链接:https://arxiv.org/abs/2205.02456代码链接&a…

python基于django的高校教师科研成果管理系统

长期以来,院校的科研水平和科研规模一直反映着我国科研技术水平技术含量,随着现代科技的日益发展,各个院校的科研活动和科研能力已成为反映高校综合实力重要指标,而随着高校专业类别的增加,教师科研领域范围扩大&#…

GreenPlum列存解密

GreenPlum支持列式存储。叫做AOCO表。那么AOCO列存是如何管理列存文件?如何实现MVCC?是否支持索引,若支持如何实现的呢?下面我们介绍下AOCO的实现机制。1、存储结构如上图所示,列存每一列单独存储一个文件。上面一个表…

文件管理命令和find命令

文件管理命令和find命令 stat命令 查看文件状态 每个文件有三个时间戳: access time访问时间,atime,读取文件内容modify time修性时间, mtime,改变文件内容change time改变时间,ctime,元数据发生改变场景是:上传了WebShell,避…

MySQL数据误删恢复操作

目录记录一次不小心删除生产数据偷偷恢复解决方案 模拟数据删除 记录下操作时间,2022-09-21下午5点左右 通过show variables like %datadir%查看binlog存放目录目录 通过show master status;查看当前binlog的记录文件 查看mysqlbinlog工具目录,需要通过此…

ANYCUBIC Photon Mono 4K光固化打印机快速上手(多次试错的经验积累)

变更记录 记录每次修订的内容,方便追溯。 版本号作者修订内容发布日期1.1Zeeland优化打印机的最佳模式内容2022年9月21日 23:41:581.0Zeeland完善基本文档2022年2月14日 19:33:52 1. 简介 笔者前期使用ANYCUBIC Photon Mono 4K光固化打印机失败了很多次&#xff0c…

Vue3——压缩字体font-spider,完美解决字体压缩后会出现字体消失现象

Vue项目打包字体完整版教程 如果打包的时候字体太大,可以选择压缩字体进行处理 打包前: 打包后: 可以看到,区别还是很明显的,下面是使用方法 这里可以使用字蛛font-spider来进行压缩 字蛛font-spider npm install font-spide…

C 语言避坑指南

文章目录👉引言💎C 避坑指南一、基础|基本常识类1 运算符类型2 占位符|格式化问题3 输入输出问题二、错题 | 程序语句类三、进阶 | 指针与函数四、进阶 | 结构体及宏定义👉引言💎 学习的最大理由是想摆脱平庸,早一天就…

linux 中 date +%s 获取1970年以来的秒数

001、(base) [root@PC1 home]# date +%s 1663810406 (base) [root@PC1 home]# date +%s 1663810410 date +%s //从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数(时间戳)参考:https://zhidao.baidu.com/question/490735500497375812.html

EasyCVR接入宇视设备后通道显示的是目录,是什么原因?

EasyCVR平台基于云边端一体化架构,充分发挥视频接入、汇聚与管理、分发、智能分析、数据共享等能力,不断在多样化场景中落地应用,不仅涵盖传统行业的安防视频监控,还涉及到景区旅游、校园教育、社区、楼宇、智慧农业等领域的应用。感兴趣的用户可以前往演示平台进行体验或部…

Docker安装Jenkins

Docker安装Jenkins 准备工作 下载Jenkins镜像 docker pull jenkins/jenkins开始安装 创建需要挂载的本地文件夹 mkdir -p 路径/jenkens chmod 777 路径/jenkens创建并启动Container docker run -d -p 8080:8080 --name=jenkins -v 路径/jenkens/:/var/jenkins_home jenkins/jen…

vue 中利用js完成等比例缩放图片和点位跟着移动

需要等比例缩放的内容 html <div class="boxImg" ref="cont" style="position: absolute; top: 0; left: 0"><!-- 这里放上需要等比例缩放的内容 --> </div> 在vue中 methods 中写 methods: {updateScaleRatio(ImgObj, ma…

linux - 搭建部署ftp服务器

ftp 服务&#xff1a; 实现ftp功能的一个服务&#xff0c;安装vsftpd软件搭建一台ftp服务器 ftp协议&#xff1a; 文件传输协议 &#xff08;file transfer protocol&#xff09;&#xff0c;在不同的机器之间实现文件传输功能&#xff0c; 例如 视频文件下载&#xff0c;…

前端之html和css(2)

目录 一&#xff0c;html 1&#xff0c;文本相关标签 2&#xff0c;列表标签 3&#xff0c;图片标签 4&#xff0c;超链接 5&#xff0c;表格标签 table 6&#xff0c;表单 form 7&#xff0c;分区标签 二&#xff0c;css层叠样式表 1&#xff0c;css样式代码的三种引入…