当前位置: 首页 > news >正文

移动端漂亮网站今天出入济南最新通知

移动端漂亮网站,今天出入济南最新通知,建立网站来网上销售的英文,营销平台建设目录 【1】CopyOnWriteArrayList 简介 【2】核心原理 1.底层数据结构 2.写时复制机制 【3】CopyOnWriteArrayList常用方法及实例 1.添加元素方法 add () 2.获取元素方法 get () 3.删除元素方法remove() 【4】优缺点分析 【5】适用场景 【6】总结 【1】CopyOnWriteAr…

目录

【1】CopyOnWriteArrayList 简介

【2】核心原理

1.底层数据结构

2.写时复制机制

【3】CopyOnWriteArrayList常用方法及实例

1.添加元素方法 add ()

2.获取元素方法 get ()

3.删除元素方法remove()

【4】优缺点分析

【5】适用场景

【6】总结


【1】CopyOnWriteArrayList 简介

        Copy-On-Write,是一种用于集合的并发访问优化策略。它的基本思想是:当我们往一个集合容器中写入元素时(添加、修改、删除),并不会直接在集合容器中写入,而是先将当前集合容器进行Copy,复制出一个新的容器,然后新的容器里写入元素,写入操作完成之后,再将原容器的引用指向新的容器

        这种策略的优点是:实现对CopyOnWrite集合容器写入操作时的线程安全,但同时并不影响进行并发的读取操作。所以CopyOnWrite容器也是一种读写分离的思想。
        从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发集合容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。

        CopyOnWriteArrayList相当于线程安全的ArrayList,内部存储结构采用Object[]数组,线程安全使用ReentrantLock实现,允许多个线程并发读取,但只能有一个线程写入。


【2】核心原理

1.底层数据结构

        CopyOnWriteArrayList 的底层数据结构是一个数组,使用volatile关键字修饰以保证可见性:

2.写时复制机制

CopyOnWriteArrayList 的核心思想是写时复制(Copy-On-Write):

  • 当进行写操作(添加、修改、删除)时,首先复制一份当前的底层数组
  • 在复制的新数组上执行写操作
  • 操作完成后,将底层数组的引用指向新数组

这种机制保证了读操作永远访问的是一个稳定的数组,不需要加锁。


【3】CopyOnWriteArrayList常用方法及实例

1.添加元素方法 add ()

        添加新元素至集合时,会将当前数组Copy复制新数组,并将新元素添加至新数组,最后替换原数组。执行过程中,使用ReentrantLock加锁,保证线程安全,避免多个线程复制数组。

public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;// 复制出新数组Object[] newElements = Arrays.copyOf(elements, len + 1);// 把新元素添加到新数组里newElements[len] = e;// 把原数组引用指向新数组setArray(newElements);return true;} finally {lock.unlock();}
}

2.获取元素方法 get ()

        根据指定下标,到原数组中读取元素。读取过程中不加锁,允许多个线程并发读取。但是如果读取的时候,有其它线程同时向集合中添加新元素并未结束,get()方法仍然读取到的是旧数据。

public E get(int index) {// 根据指定下标,从原数组中读取元素return get(getArray(), index);
}private E get(Object[] a, int index) {return (E) a[index];
}

3.删除元素方法remove()

        删除指定下标元素。根据指定下标,从原数组中,Copy复制其它元素至新数组,最后替换原数组。

public E remove(int index) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;E oldValue = get(elements, index);int numMoved = len - index - 1;if (numMoved == 0)// 复制原数组中,除最后一个元素以外的所有元素,至新数组setArray(Arrays.copyOf(elements, len - 1));else {// 复制原数组中,除删除元素以外的所有元素,至新数组Object[] newElements = new Object[len - 1];System.arraycopy(elements, 0, newElements, 0, index);System.arraycopy(elements, index + 1, newElements, index,numMoved);setArray(newElements);}return oldValue;} finally {lock.unlock();}
}

【4】优缺点分析

  • 优点

    • 读操作性能优异:读操作无需加锁,适合读多写少的场景

    • 迭代安全:迭代过程中不会抛出ConcurrentModificationException

    • 线程安全:通过写时复制和锁机制保证线程安全

  • 缺点

    • 内存占用:写操作时需要复制整个数组,可能导致内存占用翻倍

    • 数据一致性:只能保证最终一致性,不能保证实时一致性

    • 写操作性能差:每次写操作都需要复制数组,开销较大


【5】适用场景

CopyOnWriteArrayList 适用于以下场景:

  1. 读多写少的并发场景,如缓存、配置信息管理

  2. 需要避免迭代过程中ConcurrentModificationException的场景

  3. 数据量不大的场景(避免复制大数组带来的性能开销)

不适合的场景:

  1. 写操作频繁的场景

  2. 对数据实时一致性要求高的场景

  3. 存储大量数据的场景


【6】总结

        CopyOnWriteArrayList 通过独特的写时复制机制,在特定场景下提供了高效的并发处理能力。它不是万能的,但是在读多写少的场景下,相比传统的同步列表实现具有明显的优势。


        感谢你花时间读到这里~ 如果你觉得这篇内容对你有帮助,不妨点个赞让更多人看到;如果有任何想法、疑问,或者想分享你的相关经历,欢迎在评论区留言交流,你的每一条互动对我来说都很珍贵~ 我们下次再见啦!😊😊

http://www.dtcms.com/a/503493.html

相关文章:

  • UV紫外相机的简单介绍和场景应用
  • 做公众号用什么网站吗404错误页面放在网站的哪里
  • uni-app 入门学习教程,从入门到精通, uni-app常用API的详细语法知识点(上)(5)
  • 设计模式篇之 访问者模式 Visitor
  • 疾控网站建设宗旨和目的wordpress设置为繁体字
  • 免费视频素材网站有哪些游戏制作公司
  • 09_Windows平台Redis开发环境配置完整指南
  • 小谈:数据地图在制造企业的应用
  • 网站建设行业分析报告学校为什么要做网站
  • 手机特殊网站wordpress 环境
  • 使用Linux系统函数递归遍历指定目录
  • h5游戏免费下载:龟兔再跑
  • opendds初入门之qos策略初了解(有遗留)
  • 多视图几何--立体匹配--Gipuma
  • C++智能指针全面解析:原理、使用场景与最佳实践
  • C++指针使用
  • 内江规划建设教育网站国家企业信用公示信息网官网
  • 深入理解 lscpu 命令:如何准确查看 CPU 信息
  • 网站建设需要什么人希腊网站后缀
  • DSync for Mac 文件对比同步工具
  • 「日拱一码」123 内嵌神经网络ENNs
  • C++与易语言开发的基础要求分享
  • 上海市住宅建设发展中心网站建设网站有何要求
  • 广州企业网站建设公司哪家好wordpress改html5
  • ARM 架构核心知识笔记(整理与补充版)
  • 《i.MX6ULL LED 裸机开发实战:从寄存器到点亮》
  • 迈向零信任存储:基于RustFS构建内生安全的数据架构
  • 网站开发公司找哪家帮卖货平台
  • C++ Vector:动态数组的高效使用指南
  • html5微网站漂亮网站