CopyOnWriteArrayList&Collections.synchronizedList()
1、ArrayList
ArrayList是非线性安全,此类的 iterator() 和 listIterator() 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。即在一方在遍历列表,而另一方在修改列表时,会报ConcurrentModificationException错误。而这不是唯一的并发时容易发生的错误,在多线程进行插入操作时,由于没有进行同步操作,容易丢失数据。
2、CopyOnWriteArrayList
CopyOnWriteArrayList的add和remove方法是同步的(防止多个线程写操作时出现多个副本),每次修改都会创建并发布一个副本,get方法则不是同步的。看以下源码。该类的add、remove方法不具备原子性,所以一个在写,另一个线程在读到的数据可能是修改前的数据。


优点:多个线程可以同时对这个容器进行迭代,而不会相互干扰或者与修改容器的线程互相干扰,即不会抛出ConcurrentModificationException,并且返回的元素与迭代器创建时的元素完全一致,而不必考虑之后修改带来的影响。
缺点:1、在添加元素时会创建副本,如果副本占用内较大,会增加gc,严重可能会影响相应时间。2、数据只能保证最终一致性,无法保证实时性,可能读到的还是老的数据。
适用场景:适用于读多写少,并且对数据得一致性要求不高。
3、Collections.synchronizedList()


看看源码我们知道,Collections.synchronizedList()事实上是采用静态代理的方式进行操作,它的每个方法都是同步的,这样保证了列表操作都是线程安全的。相对于CopyOnWriteArrayList,Collections.synchronizedList()的在多个线程中写操作较快,读慢。
4、CopyOnWriteArrayList和Collections.synchronizedList()代码实测。
1)写
public class Test {
    public static void main(String[] args) {
        List<String> list1 = new CopyOnWriteArrayList<String>();
        List<String> list2 = Collections.synchronizedList(new ArrayList<String>());
        int count = 100;
        long time1 = System.currentTimeMillis();
        while (System.currentTimeMillis() - time1 < count) {
            list1.add("1");
        }
        System.gc();
        long time2 = System.currentTimeMillis();
        while (System.currentTimeMillis() - time2 < count) {
            list2.add("1");
        }
        System.out.println("CopyOnWriteArrayList在" + count + "毫秒时间内添加元素个数为:  " + list1.size());
        System.out.println("Collections.synchronizedList()在" + count + "毫秒时间内添加元素个数为:  " + list2.size());
    }
}
执行结果:
CopyOnWriteArrayList在100毫秒时间内添加元素个数为: 7987
Collections.synchronizedList()在100毫秒时间内添加元素个数为:  3027757
CopyOnWriteArrayList&Collections.synchronizedList()的更多相关文章
- CopyOnWriteArrayList与Collections.synchronizedList的性能对比
		列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ... 
- CopyOnWriteArrayList与Collections.synchronizedList的性能对比(转)
		列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ... 
- Collections.synchronizedList与CopyOnWriteArrayList比较
		1.单线程方式 2.多线程版本,不安全的 ArrayList 3.多线程版本,线程安全,CopyOnWriteArrayList()方式 4.多线程版本,线程安全,Collections.synchr ... 
- Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比
		## ArrayList线程安全问题 众所周知,`ArrayList`不是线程安全的,在并发场景使用`ArrayList`可能会导致add内容为null,迭代时并发修改list内容抛`Concurre ... 
- ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList  区别缺点
		ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ... 
- 集合不安全之 ArrayList及其三种解决方案【CopyOnWriteArrayList 、synchronizedList、Vector 】
		@ 目录 一.前言 二.为什么线程不安全 三.解决方案一CopyOnWriteArrayList (推荐,读多写少场景) 四.Collections.synchronizedList(加锁) 五.Ve ... 
- Collections.synchronizedList线程安全性陷阱
		摘要: 详细的解析:Collections.synchronizedList 1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedLi ... 
- 【集合类型的并发】Collections.synchronizedList
		摘要: 详细的解析:Collections.synchronizedList :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedList ... 
- Collections.synchronizedList使用
		1.SynchronizedList类具体代码: static class SynchronizedList<E> extends SynchronizedCollection<E& ... 
随机推荐
- python中的双冒号作用
			Python序列切片地址可以写为[开始:结束:步长],其中的开始和结束可以省略. 1. range(n)生成[0,n)区间整数 2. 开始start省略时,默认从第0项开始 3. 结尾省略的时候,默认 ... 
- ubuntu 安装完后对于开发需要做的事情
			是从 https://www.osboxes.org/ubuntu/ 下载的vdi文件,估计vmware对应的应该也有. 1. 安装 openssh-server apt-get install op ... 
- cocos2d-x JS 定时器暂停方法
			this.scheduleOnce(function(){ this.addChild(Menugobtn);//要暂停执行的代码 }, 10); 
- nuxtJs中直接使用自带的@nuxtjs/axios
			最初我以为在nuxtjs中是需要重新npm install axios,但是其实nuxtjs自己集成了这个数据渲染方法 你只需在nuxt.config.js中配置一下就可以了 modules: [ / ... 
- 去掉iframe边框
			css样式的border:none来去掉iframe的边框在IE下无效,需给iframe标签添加属性frameborder="no"<iframe frameborder=& ... 
- Vue单元测试Karma+Mocha
			Vue单元测试Karma+Mocha Karma是一个基于Node.js的JavaScript测试执行过程管理工具(Test Runner).该工具在Vue中的主要作用是将项目运行在各种主流Web浏览 ... 
- Jmeter接口测试+压力测试+环境配置+证书导出
			jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因为jmeter是java开发的,所以运行的时候必须先要安 ... 
- idea 报错 :error:java:Compilation failed:internal java compiler error
			当使用Tomcat运行项目时报错 翻译一下是 错误:Java:编译失败:内部Java编译器错误 这样看来更不理解了 其实原因是Java的版本不一致 查看项目的jdk版本是否一致: file----pr ... 
- K8S学习笔记之Kubernetes数据持久化方案
			在开始介绍k8s持久化存储前,我们有必要了解一下k8s的emptydir和hostpath.configmap以及secret的机制和用途. 0x00 Emptydir EmptyDir是一个空目录, ... 
- php 把一个数组分成几个数组
			<?php /* * * 把一个数组分成几个数组 * $arr 数组 * $num 获取的数量 * */ function sliceArr($arr, $num) { //数组的个数 $lis ... 
