什么是CopyOnWriteArrayList,它与ArrayList有何不同?

摘要:
CopyOnWriteArrayList是ArrayList的线程安全变体,其中所有变量操作(添加、设置等)都由基础数组的新副本实现。与ArrayList相比,它的写操作更慢,因为它需要实例的快照。CopyOnWriteArrayList中的写入操作需要在大区域复制数组,但读取操作与写入操作不是同一对象。

CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。

CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的"="将引用指向新的数组对象上来,这个几乎不需要时间,这样读操作就很快很安全,适合在多线程里使用,绝对不会发生ConcurrentModificationException ,因此CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。

免责声明:文章转载自《什么是CopyOnWriteArrayList,它与ArrayList有何不同?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【精彩回顾】第二届微医前端技术沙龙(附PPT下载)filter 以及 orderBy的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle中有关用户、角色的一些概念。

oracle中的每个用户对应一个单独的方案(schema),方案的名字与用户名一样,方案中包含很多数据对象,表,视图,触发器,存储过程等元素。 oracle中管理数据库的角色有sys,system,数据库的维护由数据库自己来完成,任何用户不得更改。 sys:所有oracle的数据字典的基表和视图都存放在sys用户中,   sys拥有dba,sysdba,s...

python的接口和抽象类

抽象基类有些面向对象的语言,如JAVA,支持接口,可以声明一个支持给定的一些方法方法,或者支持给定存取协议的类。抽象基类(或者ABCs)是Python里一个相同的特性。抽象基类由abc模块构成,包含了一个叫做ABCMeta的metaclass。这个metaclass由内置的isinstance()和issubclass()特别处理,并包含一批会被Pytho...

从0学习WebLogic CVE-2020-2551漏洞

先知社区:https://xz.aliyun.com/t/7725 最近遇到的实际环境为weblogic,所以这里顺便总结下测2020-2551的一些相关的点 2551也是学习了很多优秀的师傅文章,非常感谢 0X00 漏洞利用基础学习从0开始学习复现这个洞不免又会设计到Java反序列化漏洞中那些老生常谈的名词理解,涉及到Java反序列化中的一些协议、行为、...

html5中调用摄像头拍照

方法: getCamera: 获取摄像头管理对象 对象: Camera: 摄像头对象 CameraOption: JSON对象。调用摄像头的參数 PopPosition: JSON对象,弹出拍照或摄像界面指示位置 回调方法: CameraSuccessCallback: 调用摄像头操作成功回调 CameraErrorCallback: 摄像头操作...

C#下内存管理--垃圾收集

章节安排 内存管理简介 垃圾回收机制 性能问题 C#下非托管资源的处理 要强调的几点 References 内存管理简介       对于任何一种编程语言,内存管理都是不得不提很重要的一块内容,但可惜的是目前为止没有任何一种编程语言对内存管理处理的非常完美,每种语言都在兼顾性能 效率,语法语义易用性等方面折中中有所侧重。例如较之于C#,JAVA等语言...

深入理解javascript原型和闭包(5)——instanceof

对于值类型来说,可以用typeof判断,但typeof判断引用类型的时候返回值只有object/function,并不知道到底是哪一个。这个时候就要用到instance。例如 上图中,f1是被Foo函数创建得,但是“f1 instanceof Object”为什么是true呢? 至于为什么过会儿再说,先说下instanceof判断的规则。根据以上代码看下...