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()的更多相关文章

  1. CopyOnWriteArrayList与Collections.synchronizedList的性能对比

    列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...

  2. CopyOnWriteArrayList与Collections.synchronizedList的性能对比(转)

    列表实现有ArrayList.Vector.CopyOnWriteArrayList.Collections.synchronizedList(list)四种方式. 1 ArrayList Array ...

  3. Collections.synchronizedList与CopyOnWriteArrayList比较

    1.单线程方式 2.多线程版本,不安全的 ArrayList 3.多线程版本,线程安全,CopyOnWriteArrayList()方式 4.多线程版本,线程安全,Collections.synchr ...

  4. Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比

    ## ArrayList线程安全问题 众所周知,`ArrayList`不是线程安全的,在并发场景使用`ArrayList`可能会导致add内容为null,迭代时并发修改list内容抛`Concurre ...

  5. ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 以及 同步的集合类 Hashtable 和 Vector Collections.synchronizedMap 和 Collections.synchronizedList 区别缺点

    ConcurrentHashMap和 CopyOnWriteArrayList提供线程安全性和可伸缩性 DougLea的 util.concurrent 包除了包含许多其他有用的并发构造块之外,还包含 ...

  6. 集合不安全之 ArrayList及其三种解决方案【CopyOnWriteArrayList 、synchronizedList、Vector 】

    @ 目录 一.前言 二.为什么线程不安全 三.解决方案一CopyOnWriteArrayList (推荐,读多写少场景) 四.Collections.synchronizedList(加锁) 五.Ve ...

  7. Collections.synchronizedList线程安全性陷阱

    摘要: 详细的解析:Collections.synchronizedList 1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedLi ...

  8. 【集合类型的并发】Collections.synchronizedList

    摘要: 详细的解析:Collections.synchronizedList :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedList ...

  9. Collections.synchronizedList使用

    1.SynchronizedList类具体代码: static class SynchronizedList<E> extends SynchronizedCollection<E& ...

随机推荐

  1. DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板

    DAX/PowerBI系列 - 参数表(Parameter Table) 度量值模板 难度: ★★☆☆☆(2星) 适用范围: ★★★☆☆(3星) 概况: 当你有多个度量值都需要计算YTD,MoM,而又 ...

  2. JMeter-标的上架调整与完成

    问题:利随本青,按日的返回的参数不正确 各种计息方式的上标,新做产品的上架 散标各种计息方式的上架,新做产品的上架 修改后B环境上架 修改后C环境上架 [制作提案(担保机构)-提交18] loan.d ...

  3. C#:进程

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  4. C#中Abstract和Virtual(转载)

    在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...

  5. DoubleDQN---tensorflow实现

    完整代码:https://github.com/zle1992/Reinforcement_Learning_Game 开山之作: <Playing Atari with Deep Reinfo ...

  6. 【转】Jira插件安装

    一.Jira插件列表(可以将下面免费插件直接下载,然后登陆jira,在"插件管理"->"上传插件",将下载后的免费插件直接进行上传安装即可) 序号 插件名 ...

  7. Interesting (manacher + 前缀和处理)

    题意:相邻的两端回文串的价值为两个回文串总的区间左端点 × 区间右端点.然后计算目标串中所有该情况的总和. 思路:首先用manacher求出所有中心点的最大半径,然后我们知道对于左区间我们把贡献记录在 ...

  8. latch release ......

    MainControl_cfg.c brings error:  not defined. /* e_TIMER_MCtrlLatchReleaseTime  */     TIMER_ID_MCtr ...

  9. 一个关于cookie的坑

    #问题:今天上午踩了一个坑,首先,这个小案例的运行结果是应该是在前端页面出现一个当前时间的,当然如果是首次登陆的话应该是显示"第一次登陆",第二次则会显示上次的登录时间,但是却没有 ...

  10. javascript监听按键

    document.addEventListener('keydown',test); function test(e){ var x=e.keyCode; if(x == 49){ console.l ...