ArrayList

众所周知ArrayList是非线程安全的,在多线程的情况下,向list插入数据的时候,可能会造成数据丢失的情况.并且一个线程在遍历List,另一个线程修改List,会报ConcurrentModificationException(并发修改异常)错误.

Vector

Vector是一个线程安全的List,但是它的线程安全实现方式是对所有操作都加上了synchronized关键字,这种方式严重影响效率.所以并不推荐使用Vector.

Collections.synchronizedList(List list)

要实现List的线程安全,可以使用 Collections.synchronizedList,先看一下它的使用方法.

List<String> list = Collections.synchronizedList(new ArrayList<String>());
list.add("1");
list.add("2");
list.add("3");

synchronized (list) {
    Iterator i = list.iterator(); // Must be in synchronized block
    while (i.hasNext()) {
        //foo(i.next());
        System.out.println(i.next());
    }
}

翻看源码Collections.synchronizedList->SynchronizedList可以发现add方法加了锁,所以add时我们就不用加锁;遍历时则避免数据被其他线程串改,所以加锁保护;

synchronizedList在迭代的时候,需要开发者自己加上线程锁控制代码,因为在整个迭代的过程中如果在循环外面不加同步代码,在一次次迭代之间,其他线程对于这个容器的add或者remove会影响整个迭代的预期效果,所以这里需要用户在整个循环外面加上synchronized(list);

Collections.synchronizedList使用方法的更多相关文章

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

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

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

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

  3. Collections.synchronizedList使用

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

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

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

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

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

  6. CopyOnWriteArrayList&Collections.synchronizedList()

    1.ArrayList ArrayList是非线性安全,此类的 iterator() 和 listIterator() 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remov ...

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

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

  8. 线程安全Collections.synchronizedList

    ollections.synchronizedList引发的线程安全问题 有些容器是线程安全的(Vector,ConcurrentLinkedQueue等),有些则不是(list等),利用类 似 pr ...

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

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

  10. 关于Collections.sort()排序方法的源码探索

    /**下面在自己代码中使用Collections.sort()方法去比较Student对象,通过在自己写的类里面通过匿名内部类实现Comparator接口,这个接口是让你自己实现比较器的规则*/ // ...

随机推荐

  1. 关于tensor2tensor与tensorflow版本冲突的解决方案

    工作需要,研究了几天的t2t,万万没想到在虚拟环境的搭建方面出现了问题. 直接安装t2t,当前是1.15.7版本,默认会安装tensorflow的最新版本,最终会在执行t2t-trainer命令的时候 ...

  2. Java通过注解获取方法反射运行

    //上下文 @Resource private ApplicationContext applicationContext; @Bean public void test(){ //扫描Control ...

  3. mysql8改密码

    登录后执行语句 ALTER USER 'test'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY '新密码'; 修改Host范围 updat ...

  4. 备份docker mysql数据库

    1.查看容器 docker ps 2.进入容器 docker exec -it 容器id /bin/bash 3.备份数据 mysqldump 数据库名称 -uroot -p >/root/** ...

  5. Java基础_字符串比较

    字符串之间的比较 compareTo "==" equals compareTo 示例: compareTo(string) compareToIgnoreCase(String) ...

  6. idea中怎么查找替换数据?

    快捷键全局查询所有:crtl+shift+F 快捷键全局替换所有:crtl+shift+R 1.crtl+f crtl+r 快捷键全局查询所有:crtl+shift+F 快捷键全局替换所有:crtl+ ...

  7. pands 编码知识

    一,pandas功能 1,基于numpy , 分析结构化数据. 二,常用基础知识编码练习 包括数据类型,数据操作,比如索引,分片 ,分组聚合 ,排序 过滤等等数分常见操作代码 # coding=utf ...

  8. 前端之Vue day07 混入、插件、elementui、Router、Vuex

    一.Props补充 1.父传子在子组件标签上起自定义属性 使用数组 就不演示了,太简单了 2.限制传入的数据类类型 使用对象 同样,展示过的 3.props补充 就是套对象,加以限制 props:{ ...

  9. CamstarVP表格删除行报错

    前提:是从服务中拖出来的表格,带表达式的.但是点击删除按钮的时候,直接页面报错. 原因是:VP上面没有指定服务.

  10. scrum和SAFe

    昨天公司培训了scrum开发流程和SAFe,留点资料记录一下 网站:www.scrum.cn 资料:<scrum敏捷软件开发>