arraylist线程安全吗_Java中的集合和线程安全

efc6f07a2248a3f765c8c35a1cec562d.png

通过Java指南我们知道Java集合框架(Collection Framework)如何为并发服务,我们应该如何在单线程和多线程中使用集合(Collection)。

话题有点高端,我们不是很好理解。所以,我会尽可能的描述的简单点。通过这篇指南,你将会对Java集合由更深入的了解,而且我敢保证,这会对你的日常编码非常有用。

1. 为什么大多数的集合类不是线程安全的?

你注意到了吗?为什么多数基本集合实现类都不是线程安全的?比如:ArrayList, LinkedList, HashMap, HashSet, TreeMap, TreeSet等等。事实上,所有的集合类(除了Vector和HashTable以外)在java.util包中都不是线程安全的,只遗留了两个实现类(Vector和HashTable)是线程安全的为什么?

原因是:线程安全消耗十分昂贵!

你应该知道,Vector和HashTable在Java历史中,很早就出现了,最初的时候他们是为线程安全设计的。(如果你看了源码,你会发现这些实现类的方法都被synchronized修饰)而且很快的他们在多线程中性能表现的非常差。如你所知的,同步就需要锁,有锁就需要时间来监控,所以就降低了性能。

这就是为什么新的集合类没有提供并发控制,为了保证在单线程中提供最大的性能。

下面测试的程序验证了Vector和ArrayList的性能,两个相似的集合类(Vector是线程安全,ArrayList非线程安全)

import java.util.*;/** * This test program compares performance of Vector versus ArrayList * @author www.codejava.net * */public class CollectionsThreadSafeTest { public void testVector() { long startTime = System.currentTimeMillis(); Vector vector = new Vector<>(); for (int i = 0; i < 10_000_000; i++) { vector.addElement(i); } long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; System.out.println("Test Vector: " + totalTime + " ms"); } public void testArrayList() { long startTime = System.currentTimeMillis(); List list = new ArrayList<>(); for (int i = 0; i < 10_000_000; i++) { list.add(i); } long endTime = System.currentTimeMillis(); long totalTime = endTime - startTime; System.out.println("Test ArrayList: " + totalTime + " ms"); } public static void main(String[] args) { CollectionsThreadSafeTest tester = new CollectionsThreadSafeTest(); tester.testVector(); tester.testArrayList(); }}

通过为每个集合添加1000万个元素来测试性能,结果如下:

Test Vector: 9266 msTest ArrayList: 4588 ms

如你所看到的,在相当大的数据操作下,ArrayList速度差不多是Vector的2倍。你也拷贝上述代码自己感受下。

9a37aa1bb558ce9dd8e85bdc225ab281.png

2.快速失败迭代器(Fail-Fast Iterators)

在使用集合的时候,你也要了解到迭代器的并发策略:Fail-Fast Iterators

看下以后代码片段,遍历一个String类型的集合:

List listNames = Arrays.asList("Tom

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java @FunctionalInterface注解

FunctionalInterface 就是用来指定某个接口必须是函数式接口&#xff0c;所以 FunInterface 只能修饰接口&#xff0c;不能修饰其它程序元素。 函数式接口就是为 Java 8 的 Lambda 表达式准备的&#xff0c;Java 8 允许使用 Lambda 表达式创建函数式接口的实例&#xff0c;因此…

灰色关联与TOPSIS法 —— python

目录 1.简介 2.算法详解 2.1 指标正向化及标准化 2.2 找到最大最小参考向量 2.3 计算与参考向量的相关系数 2.4 求评分 3.实例分析 3.1 读取数据 3.2 数据标准化 3.3 得到最大最小参考行 3.4 与最大值的灰色相关系数 3.5 与最小值的灰色相关系数 3.6 计算综合评分…

spark 数据框 删除列_pandas 常用的数据处理函数

在数据分析过程中&#xff0c;首先就是对数据进行清洗和处理&#xff0c;而使用 python 进行处理的朋友们&#xff0c;对 pandas 包肯定是熟悉不过的了。pandas 的功能很强大&#xff0c;基本的数据处理操作都可以找到对应函数去使用&#xff0c;想全面了解的朋友可以查看相关文…

Java元注解作用及使用

元注解是负责对其它注解进行说明的注解&#xff0c;自定义注解时可以使用元注解。Java 5 定义了 4 个注解&#xff0c;分别是 Documented、Target、Retention 和 Inherited。Java 8 又增加了 Repeatable 和 Native 两个注解。这些注解都可以在 java.lang.annotation 包中找到。…

灰色预测法 —— matlab

目录 1.简介 2.算法详解 2.1 生成累加数据 2.2 累加后的数据表达式 2.3 求解2.2的未知参数 3.实例分析 3.1 导入数据 3.2 进行累加数据 3.3 求解系数 3.4 预测数据及对比 完整代码 1.简介 灰色系统理论认为对既含有已知信息又含有未知或非确定信息的系统进行预测&a…

jpa 自定义sql if_SpringBoot整合JPA实现多数据源及读写分离

SpringBoot整合JPA实现多数据源及读写分离项目地址&#xff1a;https://github.com/baojingyu/spring-boot-jpa-dynamic-datasource本项目使用 SpringBoot 和 SpringData JPA 实现多数据源&#xff0c;动态数据源的切换。前段时间写 MySQL 主从复制的技术分享&#xff0c;我就在…

时间序列分析简介

目录 1.引言 2.时间序列的定义 3.时间序列分析方法 &#xff08;1&#xff09;描述性时间序列分析 &#xff08;2&#xff09;统计时序分析 时序分析方法 时域分析方法 1.引言 最早的时间序列分析可以追溯到7000年前&#xff0c;古埃及把尼罗河涨落的情况逐天记录下来&a…

jupyter notebook和python有什么区别_Jupyter Notebook 有哪些奇技淫巧?

Towards Data Science专栏的作者Parul Pandey总结了七大Jupyter的进阶用法&#xff1a; 一、执行shell命令 Shell是一种与计算机进行文本交互的方式。 一般来讲&#xff0c;当你正在使用Python编译器&#xff0c;需要用到命令行工具的时候&#xff0c;要在shell和IDLE之间进行切…

时间序列的预处理

目录 一、特征统计量 1.概率分布 2.特征统计量 二、平稳时间序列的定义 严平稳与宽平稳的关系 三、平稳时间序列的统计性 四、平稳性的重大意义 五、平稳性检验 时序图检验 自相关图检验 R绘图 一、特征统计量 平稳性是某些时间序列具有的一种统计特征要描述清楚这个…

Java系统流

每个 Java 程序运行时都带有一个系统流&#xff0c;系统流对应的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流&#xff0c;分别通过 in、out 和 err 变量来引用。这 3 个系统流如下所示&#xff1a; System.in&#xff1a;标准输入流&#xff0c;默认设…

R中‘ts‘ object must have one or more observations

错误如下&#xff1a; 为什么会出现&#xff0c;如下错误是因为我读取数据是&#xff0c;没有对数据进行分割&#xff0c;而是直接读取&#xff0c;然后使用的 最初读取方式为&#xff1a; 改变后的读取方式&#xff1a; 此时&#xff0c;再调用上面提示错误的那行代码试试&am…

python编码和解码_uu --- 对 uuencode 文件进行编码与解码 — Python 3.7.9 文档

uu --- 对 uuencode 文件进行编码与解码 此模块使用 uuencode 格式来编码和解码文件&#xff0c;以便任意二进制数据可通过仅限 ASCII 码的连接进行传输。 在任何要求文件参数的地方&#xff0c;这些方法都接受文件类对象。 为了保持向下兼容&#xff0c;也接受包含路径名称的字…

Java字符编码介绍

在计算机中&#xff0c;任何的文字都是以指定的编码方式存在的&#xff0c;在 Java 程序的开发中最常见的是 ISO8859-1、GBK/GB2312、Unicode、 UTF 编码。 Java 中常见编码说明如下&#xff1a; ISO8859-1&#xff1a;属于单字节编码&#xff0c;最多只能表示 0~255 的字符范…

灰色预测法 —— python

目录 1.简介 2.算法详解 2.1 生成累加数据 2.2 累加后的数据表达式 2.3 求解2.2的未知参数 3.实例分析 3.1 导入数据 3.2 进行累加数据 3.3 求解系数 3.4 预测数据及对比 完整代码 1.简介 灰色系统理论认为对既含有已知信息又含有未知或非确定信息的系统进行预测&am…

python爬虫怎么爬小说_python爬虫爬取笔趣网小说网站过程图解

首先&#xff1a;文章用到的解析库介绍 BeautifulSoup&#xff1a; Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。 它是一个工具箱&#xff0c;通过解析文档为用户提供需要抓取的数据&#xff0c;因为简单&#xff0c;所以不需要多少代…

Java File类详解

在 Java 中&#xff0c;File 类是 java.io 包中唯一代表磁盘文件本身的对象&#xff0c;也就是说&#xff0c;如果希望在程序中操作文件和目录&#xff0c;则都可以通过 File 类来完成。File 类定义了一些方法来操作文件&#xff0c;如新建、删除、重命名文件和目录等。 File …

时间序列的预处理之纯随机性检验

目录 1.纯随机序列的定义 2.性质 3.纯随机性检验 1.纯随机序列的定义 纯随机序列也称为白噪声序列&#xff0c;满足如下性质&#xff1a;2.性质 纯随机性&#xff08;无记忆性&#xff09;方差齐性举例&#xff0c;随机生成1000个白噪声序列 用正态分布序列 rnorm(数量&am…

python logger设置信息取得_shell 脚本中如何获取 python logging 打印的信息?

在 shell 脚本中调用 python 的接口&#xff0c;但是 python API 是通过 python 的 logging 把相关信息打印到屏幕上的&#xff0c;不知道这种情况在 shell 中怎么获取这些 logging 信息&#xff0c;请指教。 代码中是这么写的&#xff1a; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1…

Java字节流的使用

InputStream 是 Java 所有字节输入流类的父类&#xff0c;OutputStream 是 Java 所有字节输出流类的父类&#xff0c;它们都是一个抽象类&#xff0c;因此继承它们的子类要重新定义父类中的抽象方法。 下面首先介绍上述两个父类提供的常用方法&#xff0c;然后介绍如何使用它们…

ARMA模型的性质之方法性工具

目录 一、差分 Xt 二、延迟算子 延迟算子的性质 p阶差分 k步差分 三、线性差分方程 齐次线性差分方程的解 非齐次线性差分方程的解 时序分析与线性差分方程的关系 一、差分 Xt 二、延迟算子 延迟算子类似于一个时间指针&#xff0c;当前序列值乘以一个延迟算子&…