考虑线程安全的List集合选择
考虑线程安全的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集合选择相关推荐
- 验证ArrayList是线程不安全的集合
package collectionSafe; import java.util.ArrayList;import java.util.Collections;import java.util.Lis ...
- Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种...
2019独角兽企业重金招聘Python工程师标准>>> 今天为在Windows下建立PHP开发环境,在考虑下载何种PHP版本时,遭遇一些让我困惑的情况,为了解决这些困惑,不出意料地牵 ...
- 【JUC】第二章 线程间通信、集合的线程安全
第二章 线程间通信.集合的线程安全 文章目录 第二章 线程间通信.集合的线程安全 一.线程间通信 1.介绍 2.synchronized 方案 3.Lock 方案 4.定制化线程通信 二.集合的线程安 ...
- Java中,通过synchronizedXxx()将线程不安全的集合转换成线程安全的集合
保证线程安全的方法 synchronizedXxx():该方法可以使指定的集合包装成线程安全的集合,并返回 例如: Collections.synchronizedList(List) 将线程不安全的 ...
- 【Android 内存优化】内存抖动 ( 垃圾回收算法总结 | 分代收集算法补充 | 内存抖动排查 | 内存抖动操作 | 集合选择 )
文章目录 一. 垃圾回收算法总结 二. 分代收集算法补充 三. 查看 Java 虚拟机 四. 获取 Android 应用可使用最大内存 五. 内存抖动标志 六. 排查内存抖动 七. 常见的造成内存抖动 ...
- arraylist线程安全吗_java集合----超详细图解(ArrayList线程安全解决三种解决方法!)...
(注意:多线程情况下的判断,如果你能确定就两个线程(不包括main主线程或者是说GC),判断可以用if,但如果是多个线程则用while,否则会出现错误)ArrayList线程安全的几个问题解决(Has ...
- Java哪些是线程安全的_Java集合中那些类是线程安全的
线程安全类 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的.在jdk1.2之后,就出现许许多多非线程安全的类. 下面是这些线程安全的同步的类: vector:就比arraylist多 ...
- java 线程同步的list_java集合框架线程同步代码详解
List接口的大小可变数组的实现.实现了所有可选列表操作,并允许包括null在内的所有元素.除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小.(此类大致上等同于Vector ...
- java创建线程安全的Set集合
CopyOnWriteArraySet CopyOnWriteArraySet<String> copyOnWriteArraySet = new CopyOnWriteArraySet& ...
最新文章
- TensorFlow中的ResNet残差网络实战(1)
- 【linux基于Postfix和Dovecot邮件系统的搭建】
- 源码安装vlc播放器
- 搭建EJB3开发环境
- python使用函数的目的_python之函数基本使用
- CSSE*PTC student tutoring program student lecturers of 2018-2019 Academic Year.
- Java连接SQL Server 2012【查看自己电脑上的SQL Server端口号;附:jar包】
- 腾讯2016春招之算法编程解析
- 使用Java查询DynamoDB项
- 博文视点大讲堂第30期——职场新人胜出关键点
- 局域网中传输介质的应用分析
- emmet 工具的基本使用,总结
- mpvue 微信小程序设置背景音乐
- 抓取Js动态生成数据且以滚动页面方式分页的网页
- mongodb常用操作——命令行
- SQL注入攻击防御深层思考
- 使用laravel快速开发网站流程(composer)
- 关于group by的用法
- 填坑记录——扫雷游戏的重置
- 【跨境电商平台规则与合规研讨会】在跨境驿站顺利召开
热门文章
- 学计算机买宏基好吗,想买轻薄笔记本,宏碁蜂鸟是不错的选择
- scrapy 保存到mysql_Scrapy保存数据到mysql
- 在JSP中定义一个全局变量,供所有页面引用
- html+word+clou,AE脚本:Word Cloud 1.0.3_文字云排版动画脚本+教程
- 前端websockt可重连功能的插件
- 函数的基本使用,切克闹
- QQ欢乐斗地主心得体会 (三):高倍场攻略
- 秉火429笔记之十五 DMA--直接存储区访问
- 可能是最优雅的分割线实现方式CSS实现
- 【Python 实战基础】什么是PyQt6? 简单介绍一下PyQt6