java并发编程之 CopyOnWriteArrayList

【java】java 并发编程 CopyOnWriteArrayList 文章目录1.介绍2. 原理和数据结构2.1 线程安全2.2 结构3. 函数列表4. 源码分析4.1. 创建4.2. 添加4.3. 获取4.4 删除4.5. 遍历5. 示例M.扩展阅读 1.介绍 它相当于线程安全的ArrayList。和ArrayList一样,它是个可变数组;但是和ArrayList不同的时,它具有以下特性: 它最适合于具有以下特征的应用程序:List 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。 它是线程安全的。 因为通常需要复制整个基础数组,所以 阅读详情

我们都知道在java容器中ArrayList是线程不安全的,而vector是线程安全的。那么针对线程安全和不安全来说,这两个容器应该是够用了,为什么还要出现一个CopyOnWriteArrayList这个容器呢?CopyOnWriteArrayList是线程安全的,那么它较vector有哪些优势呢?

看一下vector的add和get源码

/**
     * Appends the specified element to the end of this Vector.
     *
     * @param e element to be appended to this Vector
     * @return {@code true} (as specified by {@link Collection#add})
     * @since 1.2
     */
    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }


/**
     * Returns the element at the specified position in this Vector.
     *
     * @param index index of the element to return
     * @return object at the specified index
     * @throws ArrayIndexOutOfBoundsException if the index is out of range
     *            ({@code index < 0 || index >= size()})
     * @since 1.2
     */
    public synchronized E get(int index) {
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);

        return elementData(index);
    }

可以看到对于vector的add和get方法都被synchronize修饰了,这就说明了当我在获取数据的时候,其他线程也是不能获取的,所有的读和写都会被阻塞。

再来看CopyOnWriteArrayList中的源码

/**
     * Inserts the specified element at the specified position in this
     * list. Shifts the element currently at that position (if any) and
     * any subsequent elements to the right (adds one to their indices).
     *
     * @throws IndexOutOfBoundsException {@inheritDoc}
     */
    public void add(int index, E element) {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
            if (index > len || index < 0)
                throw new IndexOutOfBoundsException("Index: "+index+
                                                    ", Size: "+len);
            Object[] newElements;
            int numMoved = len - index;
            if (numMoved == 0)
                newElements = Arrays.copyOf(elements, len + 1);
            else {
                newElements = new Object[len + 1];
                System.arraycopy(elements, 0, newElements, 0, index);
                System.arraycopy(elements, index, newElements, index + 1,
                                 numMoved);
            }
            newElements[index] = element;
            setArray(newElements);
        } finally {
            lock.unlock();
        }
    }

简单的概括就是,在添加数据的时候,系统会复制一个新的list然后添加的时候往新的array添加,当然这个新的list是lock确保线程安全的。

等新的list操作完成之后,再把旧的list引用的地址指向它即可。但是旧的list是没有加锁的,所以读的操作是不会阻塞的。

copyOnWriterArrayList通过消耗空间的方式来提高系统的并发性,但是这样浪费了空间,容易造成minor Gc ,严重的话会造成full gc。所以要根据情况来选择使用。

Java并发编程中并发容器ConcurrentHashMap和CopyOnWriteArrayList JDK 5 中加入的 ConcurrentHashMap:用来替代同步且基于散列的Map CopyOnWriteArrayList:用于在遍历操作为主要操作的情况下替代同步的List ConcurrentMap:“若没有则添加”、替换、有条件删除 Queue:用来临时保存一组待处理的元素,Queue上的操作不会阻塞,如果队列为空,那么获取元素的操作将返回空值。虽然可以用List来模拟Que 阅读详情

相关推荐

HR离职预测模型实战:可解释、可干预、可落地的三层架构

员工离职预测本质上是组织健康度的早期诊断技术,其核心原理在于从行为、心理与结构数据中识别稳定性衰减信号。该技术的价值不仅在于提升预测准确率,更在于将模糊的‘人才风险’转化为可归因、可干预的具体因子,如工龄阶段、满意度落差、薪酬分位数等。典型应用场景覆盖HRBP主动留任、业务部门梯队预警及HRIS系统智能升级。本文聚焦于构建具备业务可解释性与操作闭环能力的离职预警模型,深度融合HR工作流与机器学习工程实践,尤其强调逻辑回归基线、特征业务化重构及三层递进式架构设计。

赵士杰的博客 387

CopyOnWriterArrayList 详解

在 ArrayList 的类注释上,JDK 就提醒了我们,如果要把 ArrayList 作为共享变量的话,是线程不安全的,推荐我们自己加锁或者使用 Collections.synchronizedList 方法,其实 JDK 还提供了另外一种线程安全的 List,叫做 CopyOnWriteArrayList。......

GeGe&YoYo的博客 1万+

大疆mini 3 pro rtmp推流(带屏遥控器不支持)windows

大疆mini 3 pro无人机rtmp推流(带屏遥控器不支持)至windows电脑

xbsigeibwkouvfcj的博客 3430

并发编程一:CopyOnWriteArrayList

除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的)。 先回顾一下一个常识: 1、JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个对象,一个线程获取这个引用指向的对象,那么他们之间不会发生ConcurrentModificationException,他们是在虚拟机层面阻塞的,而且速度非常快,几乎不需要CPU时间。 2

keep_moving_cqu的专栏 1621

.NET适配HarmonyOS进展 1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2301_76476890的博客 1461

EVM算法的Python实现

EVM(Eulerian Video Magnification,欧拉视频放大或欧拉影像放大)是一种将视频中的微小变化进行放大的算法,正如论文标题所说《Eulerian Video Magnification for Revealing Subtle Changes in the World》,该算法可以将视频中的微小变化转变为肉眼可以

flyingzhao 1万+

Java并发编程系列学习_并发容器CopyOnWriteArrayList

一、ArrayList线程不安全的原因 ArrayList很常用,但是该集合并不是一个线程安全的集合,首先我们来看下这个集合的内部构造成员: public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java....

JingHaiRoad Coder 283

第42篇FEDGLOSS算法BEYOND LOCAL SHARPNESS:COMMUNICATION-EFFICIENT GLOBALSHARPNESS-AWARE MINIMIZATIONFOR

:用上一轮伪梯度最小化锐度,获取与全局损失最相关的几何信息,引导全局优化趋向更平坦的最小值。效果对比分析:FEDGLOss。

weixin_74009895的博客 526

CopyOnWriterArrayList原理

CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

yzx3105的博客 635

NVIDIA A100驱动及CUDA安装指南

NVIDIA A100驱动及CUDA安装指南:详细介绍了在Ubuntu系统下安装A100显卡驱动和CUDA工具包的完整流程,包括环境准备、驱动安装、CUDA配置及性能优化建议。特别推荐猿界算力平台提供开箱即用的A100算力租赁服务,具备专业团队支持、灵活租期和实惠价格等优势。文末通过PyTorch测试验证了A100设备的可用性,展示了80GB显存的强大计算能力。

2401_89353317的博客 1511

Oracle数据库表空间使用情况查询

在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对象的逻辑存储单元。了解表空间的使用情况对于数据库管理员和开发人员来说是非常重要的,因为它可以帮助他们监控数据库的空间使用情况并进行容量规划。本文将介绍如何查询Oracle数据库中的表空间使用情况。通过执行以上SQL查询语句,你可以获得Oracle数据库中表空间的使用情况、文件大小和表空间大小等信息。这些信息可以帮助你了解数据库的存储情况,并进行适当的优化和容量规划。查看表空间的数据文件和表空间大小。查看表空间的使用情况。

CsmbPascal的博客 859

java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList 解决方法

控制台报错如下 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.ClassCastException:java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList 报错代码 //获取一个字符串数组 String[] idsArr= s.sp.

JavaWebEngineer的博客 1万+

Android功耗系列专题理论之二十一:Power Monitor测功耗详细说明和注意事项

本文详细介绍了PowerMonitor手机功耗测试仪的功能与使用方法。该设备通过硬件连接替代手机电池,实时监测电流、电压等参数,适用于研发测试、软件优化等场景。文章包含设备接线说明(电源、USB、手机供电等接口)、驱动安装步骤及常见问题排查,并详细讲解了功耗测量操作流程,包括电压设置、开机步骤、数据采集与导出方法。特别强调了测量注意事项,如固定屏幕亮度、关闭后台应用、确保稳定连接等,以确保测试数据准确性。最后提供了简易测量步骤和详细测量流程指导。

596

Java并发编程—CopyOnWriteArrayList

1 概述 JUC并发包中只提供了一个并发list就是CopyOnWriteList,是线程安全的(内部有一个独占锁ReetrantLock),采用的是写时复制的策略。整体的类图结构如下图所示。 下面从构造方法,增删改查与迭代器遍历来对该类进行一些详细的介绍。 2 构造方法 该类共有三个构造方法,一个无参构造,一个传入一个集合的有参构造,一个是传入一个泛型数组的有参构造 public CopyOnWriteArrayList() //无参构造器在内部创建了一个大小为0的Object数组 p..

wait2023的博客 509

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深入剖析Java并发编程核心原理:从ConcurrentHashMap到CopyOnWriteArrayList

在多核处理器成为主流的今天,并发编程已成为提升系统性能的关键手段。竞态条件内存可见性问题以及指令重排序带来的不确定性。这些问题直接催生了Java内存模型(JMM)的诞生,通过happens-before规则、volatile语义和同步机制构建起线程安全的基础框架。以经典的i++操作为例,这个看似简单的语句实际上包含读取、计算、写入三个步骤,在多线程环境下可能因线程切换导致计算结果丢失。传统的关键字虽然能解决这些问题,但粗粒度的锁机制往往成为性能瓶颈。此时,并发容器。

zuiyuelong的博客 707

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java并发编程:并发容器之CopyOnWriteArrayList

来源: http://www.cnblogs.com/dolphin0520/p/3938914.html

zhaoyang10的专栏 159

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java并发编程之CopyOnWriteArrayList

什么是CopyOnWrite Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。 什么是CopyOnWrite容器 CopyOnWrite容器即写时复制的容器。当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容...

Geffin的博客 409

Java并发编程:并发容器之CopyOnWriteArrayList(转载)

CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

m0_46225088的博客 107

Java并发编程 - JUC并发集合(CopyOnWriteArrayList、CopyOnWriteArraySet)

和是 Java 并发编程中非常有用的线程安全集合类。它们通过复制整个数组并在副本上进行修改来保证线程安全,特别适用于读多写少的场景。然而,由于它们在写操作时创建数组副本,因此在写操作频繁的场景下可能会导致较高的内存消耗。在实际开发中,应根据具体的应用场景选择合适的并发集合类。

qq_33240556的博客 547

Java并发编程之CopyOnWriteArraylist

Java并发编程之CopyOnWriteArraylist 引言: Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。CopyOnWrite容器非常有用,可以在非

zdl_csdn的博客 280

Java 并发编程之 CopyOnWriteArrayList

简单说就是读写分离,读不加锁,增删改时加锁复制,线程安全; 写的效率比较低,相对Vector类读写都加锁,CopyOnWriteArrayList读的效率更高,适合读多写少,并且不要求实时一致性的使用场景。 方法有: public boolean add(E e),public void add(int index, E element) public E set(int index, E element),public E get(int index) public E remove(int .

风香枫 318

Java并发编程六之CopyOnWriteArrayList

阅读目录CopyOnWriteArrayList是什么为什么使用CopyOnWriteArrayListCopyOnWriteArrayList实现 CopyOnWriteArrayList是什么 CopyOnWriteArrayList 是jdk1.5以后并发包中提供的一种并发容器,写操作通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也成为“写时复制容器”,类似的容器还有 CopyOnWriteArraySet。 为什么使用CopyOnWriteArrayList 众所周知,集合框架

yangyanping20108的博客 373
上一篇: JVM GC垃圾回收器详解
下一篇: TCP连续ARQ协议和滑动窗口协议
CallMeJiaGu
博客等级 码龄12年 149粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值