考虑线程安全的List集合选择

  • Vector
  • 线程安全的List
  • 总结

Vector

Vector集合
底层是一种可增长对象数组,查询快,增删慢
线程安全,同步,但是因为所有方法都加了synchronized导致执行效率不高,不能灵活的应用。多数情况下不使用。
具体图解如下:

JDK1.8源码如下:

public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{

本质依然是数组:

    public Vector() {this(10);}public Vector(int initialCapacity) {this(initialCapacity, 0);}public Vector(int initialCapacity, int capacityIncrement) {super();if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);this.elementData = new Object[initialCapacity];this.capacityIncrement = capacityIncrement;}

操作方法都加了synchronized关键字:

public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;}
public synchronized void setSize(int newSize) {modCount++;if (newSize > elementCount) {ensureCapacityHelper(newSize);} else {for (int i = newSize ; i < elementCount ; i++) {elementData[i] = null;}}elementCount = newSize;}.........

synchronized关键字的介绍就找一个连接吧!

线程安全的List

使用 Collections.synchronizedList,当然Collections还有其他的方法。

ArrayList arrayList=new ArrayList();
List synList = Collections.synchronizedList(arrayList);

下面查看一下源码:

public static <T> List<T> synchronizedList(List<T> list) {//instanceof 测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型return (list instanceof RandomAccess ?new SynchronizedRandomAccessList<>(list) :new SynchronizedList<>(list));}
static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E> {private static final long serialVersionUID = -7754090372962971524L;final List<E> list;SynchronizedList(List<E> list) {super(list);this.list = list;}
//我们看到加了同步代码块
public void add(int index, E element) {synchronized (mutex) {list.add(index, element);}}
public E get(int index) {synchronized (mutex) {return list.get(index);}}...}

总结

需要线程安全的时候用一下Collections.synchronizedList,不需要的时候就直接用List,方便灵活。

考虑线程安全的List集合选择相关推荐

  1. 验证ArrayList是线程不安全的集合

    package collectionSafe; import java.util.ArrayList;import java.util.Collections;import java.util.Lis ...

  2. Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种...

    2019独角兽企业重金招聘Python工程师标准>>> 今天为在Windows下建立PHP开发环境,在考虑下载何种PHP版本时,遭遇一些让我困惑的情况,为了解决这些困惑,不出意料地牵 ...

  3. 【JUC】第二章 线程间通信、集合的线程安全

    第二章 线程间通信.集合的线程安全 文章目录 第二章 线程间通信.集合的线程安全 一.线程间通信 1.介绍 2.synchronized 方案 3.Lock 方案 4.定制化线程通信 二.集合的线程安 ...

  4. Java中,通过synchronizedXxx()将线程不安全的集合转换成线程安全的集合

    保证线程安全的方法 synchronizedXxx():该方法可以使指定的集合包装成线程安全的集合,并返回 例如: Collections.synchronizedList(List) 将线程不安全的 ...

  5. 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )

    文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...

  6. arraylist线程安全吗_java集合----超详细图解(ArrayList线程安全解决三种解决方法!)...

    (注意:多线程情况下的判断,如果你能确定就两个线程(不包括main主线程或者是说GC),判断可以用if,但如果是多个线程则用while,否则会出现错误)ArrayList线程安全的几个问题解决(Has ...

  7. Java哪些是线程安全的_Java集合中那些类是线程安全的

    线程安全类 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的.在jdk1.2之后,就出现许许多多非线程安全的类. 下面是这些线程安全的同步的类: vector:就比arraylist多 ...

  8. java 线程同步的list_java集合框架线程同步代码详解

    List接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.(此类大致上等同于Vector ...

  9. java创建线程安全的Set集合

    CopyOnWriteArraySet CopyOnWriteArraySet<String> copyOnWriteArraySet = new CopyOnWriteArraySet& ...

最新文章

  1. TensorFlow中的ResNet残差网络实战(1)
  2. 【linux基于Postfix和Dovecot邮件系统的搭建】
  3. 源码安装vlc播放器
  4. 搭建EJB3开发环境
  5. python使用函数的目的_python之函数基本使用
  6. CSSE*PTC student tutoring program student lecturers of 2018-2019 Academic Year.
  7. Java连接SQL Server 2012【查看自己电脑上的SQL Server端口号;附:jar包】
  8. 腾讯2016春招之算法编程解析
  9. 使用Java查询DynamoDB项
  10. 博文视点大讲堂第30期——职场新人胜出关键点
  11. 局域网中传输介质的应用分析
  12. emmet 工具的基本使用,总结
  13. mpvue 微信小程序设置背景音乐
  14. 抓取Js动态生成数据且以滚动页面方式分页的网页
  15. mongodb常用操作——命令行
  16. SQL注入攻击防御深层思考
  17. 使用laravel快速开发网站流程(composer)
  18. 关于group by的用法
  19. 填坑记录——扫雷游戏的重置
  20. 【跨境电商平台规则与合规研讨会】在跨境驿站顺利召开

热门文章

  1. 学计算机买宏基好吗,想买轻薄笔记本,宏碁蜂鸟是不错的选择
  2. scrapy 保存到mysql_Scrapy保存数据到mysql
  3. 在JSP中定义一个全局变量,供所有页面引用
  4. html+word+clou,AE脚本:Word Cloud 1.0.3_文字云排版动画脚本+教程
  5. 前端websockt可重连功能的插件
  6. 函数的基本使用,切克闹
  7. QQ欢乐斗地主心得体会 (三):高倍场攻略
  8. 秉火429笔记之十五 DMA--直接存储区访问
  9. 可能是最优雅的分割线实现方式CSS实现
  10. 【Python 实战基础】什么是PyQt6? 简单介绍一下PyQt6