首页 > 其他分享 >19. 说说CopyOnWriteArrayList

19. 说说CopyOnWriteArrayList

时间:2024-12-23 16:19:50浏览次数:8  
标签:容器 加锁 19 list CopyOnWriteArrayList 并发 线程

CopyOnWriteArrayList是Java并发包中提供的一个并发容器。CopyOnWriteArrayList相当于线程安全的ArrayList,CopyOnWriteArrayList使用了一种叫写时复制的方法,当有新元素add到CopyOnWriteArrayList时,先从原有的数组中拷贝一份出来,然后在新的数组做写操作,写完之后,再将原来的数组引用指向到新数组。

CopyOnWriteArrayList中add方法添加的时候是需要加锁的,保证同步,避免了多线程写的时候复制出多个副本。读的时候不需要加锁,如果读的时候有其他线程正在向CopyOnWriteArrayList添加数据,还是可以读到旧的数据。

CopyOnWrite并发容器用于读多写少的并发场景。
优点
读操作性能很高,因为无需任何同步措施,比较适用于读多写少的并发场景。Java的list在遍历时,若中途有别的线程对list容器进行修改,则会抛出ConcurrentModificationException异常。而CopyOnWriteArrayList由于其"读写分离"的思想,遍历和修改操作分别作用在不同的list容器,所以在使用迭代器进行遍历时候,也就不会抛出ConcurrentModificationException异常了。
缺点
一是内存占用问题,毕竟每次执行写操作都要将原容器拷贝一份,数据量大时,对内存压力较大,可能会引起频繁GC;
二是无法保证实时性,Vector对于读写操作均加锁同步,可以保证读和写的强一致性。而CopyOnWriteArrayList由于其实现策略的原因,写和读分别作用在新老不同容器上,在写操作执行过程中,读不会阻塞但读取到的却是老容器的数据。

标签:容器,加锁,19,list,CopyOnWriteArrayList,并发,线程
From: https://www.cnblogs.com/tim-zuo/p/18624335

相关文章

  • AT_keyence2019_e Connecting Cities 题解
    题目传送门前置知识Boruvka算法解法考虑Boruvka算法。拆掉绝对值后得到\(a_{i}+id,a_{i}-id,a_{j}+id,a_{j}-id\)四个式子。vector启发式合并辅助线段树查询的常数过大,无法通过。上述做法的常数在于一条边会被计算两次,考虑优化。不妨直接钦定向前连、向后连的贡献,顺......
  • 园子博客后台升级至 angular 19 后 eslint 9 迁移记录
    最近在将园子的博客后台从angular15升级至angular19,升级基本完成后发现eslint不能正常工作。vscodeoutputpanel出现了eslint的警告与报错(node:8724)ESLintIgnoreWarning:The".eslintignore"fileisnolongersupported.Switchtousingthe"ignores"proper......
  • [CF1965F] conference
    题意:有\(n\)个讲师,对于讲师\(i\),他可以在\([l_i,r_i]\)中选一天讲课,问对于\(x\in[1,n]\),有多少连续的\(x\)天可以做到都有讲师讲课。先考虑区间的\(l\)互不相同时如何解决。对于已知的\([l,r]\)是否存在完美匹配,判断是简单的,我们贪心地按天数从左往右依次解决,每次......
  • Averaging Weights Leads to Wider Optima and Better Generalization(SWA2018-2019)平
    第一部分:解决的问题论文解决的是深度神经网络优化过程中模型的泛化能力提升问题。具体来说:背景问题:在深度学习中,SGD(随机梯度下降)及其变种是主要的优化方法,但其找到的解通常在权重空间中是“尖锐(参数稍微变一点损失函数就会变化很大)的”(sharpminima),对模型泛化性能有负面影......
  • 2024-2025-1 20241319 《计算机基础与程序设计》第十三周学习总结
    作业信息这个作业属于哪个课程2024-2025-1-计算机基础与程序设计这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13这个作业的目标《C语言程序设计》第12章作业正文https://www.cnblogs.com/wchxx/p/18622144**教材学习内容总结结......
  • 20241219
    混凝土期末报告#导入必要的库importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportseabornassns#数据科学与机器学习库fromsklearn.model_selectionimporttrain_test_split,GridSearchCVfromsklearn.preprocessingimportStandardSc......
  • 操作系统(19)文件目录
    前言    操作系统中的文件目录是组织和存储文件的关键组成部分,它使得操作系统能够有效地对文件实施统一管理。一、文件目录的作用    文件目录的主要作用是将文件名转换为文件在外存的物理位置。用户通过文件名来访问文件,而文件目录则提供了文件名与文件物......
  • CMake构建学习笔记19-OpenSSL库的构建
    1.概述OpenSSL是一个开源的加密工具包和库,主要实现了安全套接字层(SSL)和传输层安全(TLS)协议,以及各种加密算法、数字签名、消息摘要、加密证书等功能。这个库可以说是Web开发尤其是HTTPS通信的基石了。这里就具体讲解一下如何构建它。2.构建过程2.1Windows环境首先要说明的是O......
  • [EIS 2019]EzPOP
    [EIS2019]EzPOP[EIS2019]EzPOP-天水麒麟儿-博客园这篇wp我感觉看的最明白,思路很舒服总结这道题目就是在考些php特性代码分析首先拿到源码看到unserialize然后看到两个类,第一反应那就是反序列化了,直接找出口$data="<?php\n//".sprintf('%012d',$expire)."\nexit......
  • //需求//某系统的数字密码(大于0),比如1983,采用加密方式进行传输;//规则如下:先得到每位数
    //需求//某系统的数字密码(大于0),比如1983,采用加密方式进行传输;//规则如下:先得到每位数,然后每位数都加上5,再对10求余,最后将所有数字反转,得到一串新数;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){//1.通过输入......