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,一经查实,立即删除!

相关文章

灰色关联与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…

时间序列的预处理

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

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

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

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;所以不需要多少代…

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

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

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

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

python如何下载库_python中如何下载库

python下载安装库的方法&#xff1a; 1、在线安装 在cmd窗口直接运行&#xff1a;pip install 包名&#xff0c;如 pip install requests 注意&#xff1a;这种方式安装时会自动下载第三方库&#xff0c;安装完成后并不会删除&#xff0c;如需删除请到它的默认下载路径下手动删…

ARMA模型的性质 1

目录 1.wold分解定理&#xff08;1938&#xff09; 2.AR模型 2.1定义&#xff1a; AR(p) 有三个限制条件&#xff1a; 中心化 AR(p) 模型 2.2 AR模型的平稳性判别 序列拟合函数 R 举例 1.wold分解定理&#xff08;1938&#xff09; 对于任何一个离散平稳序列 {xt} 他都…

python 二维码_Python提取支付宝和微信支付二维码

本文首发于我的个人博客&#xff0c;更多 Python 和 django 开发教程&#xff0c;请访问 追梦人物的博客。支付宝或者微信支付导出的收款二维码&#xff0c;除了二维码部分&#xff0c;还有很大一块背景图案&#xff0c;例如下面就是微信支付的收款二维码&#xff1a;有时候我们…

ARMA模型的平稳性判别(续)

目录 1.特征根判别法 AR(p)模型对应齐次方程特征根与回归系数多项式根的关系&#xff1a; 2.平稳域判别 &#xff08;1&#xff09;AR(1)(一阶)模型平稳域 &#xff08;2&#xff09;AR(2)(二阶)模型平稳域 3.举例 4.函数展开成幂级数——麦克劳林级数 小结 1.特征根判…

form表单中根据值判断是否disabled_Java 0基础入门 (Html表单、表单元素)

上一篇&#xff1a;Java 0基础入门 (Html标签的使用)表单在网页中主要负责数据采集功能。一.表单实际应用场景百度搜索5173注册如上两张图&#xff0c;图中的黑色线条是我画上去的&#xff0c;如果按照黑线&#xff0c;在Excle中画出这两张表单&#xff0c;相信大家都可以也不是…

ARMA模型性质之平稳AR模型得统计性质

目录 1.均值 Green函数定义 Green函数递推公式 2.方差 举例&#xff1a; 方法1&#xff1a; 方法2&#xff1a; 3.协方差函数 举例1&#xff1a; 举例2&#xff1a; 4.自相关系数 常用的ARA模型自相关系数递推公式&#xff1a; AR模型自相关系数的性质 举例 5.偏自…

LDA(线性判别分析(普通法))详解 —— python

在这里和大家道个歉&#xff0c;因为我有一篇matlab的LDA和这篇内容大致相同&#xff0c;我就犯懒了&#xff0c;直接复制&#xff0c;没想到公式复制过来全变成了图片&#xff0c;然后造成了&#xff0c;排版有问题&#xff0c;非常难看&#xff0c;真的很抱歉&#xff01;&am…