当前位置:首页 > Java技术 > Java线程安全的集合

Java线程安全的集合

2022年09月17日 22:51:55Java技术8

前言

线程安全集合是指该集合可以在多线程并发读取的状态下,能够保持数据集合有序,不发生同步错误。

一、早期的线程安全集合

我们先说早期的线程安全集合,也是各种面试题或者考试题经常喜欢问的,它们是Vector和HashTable。

说实话,在实际的项目开发中,从来没有用过这两个线程集合,已经过时了,不知道为什么一直在考。

1.1 Vector

VectorArrayList类似,是长度可变的数组,与ArrayList不同的是,Vector是线程安全的,它几乎给所有的public方法都加上了sychronized关键字。由于加锁倒是性能降低,在不需要并发访问时,这种强制性的同步就显得多余,所以现在几乎没有什么人在使用。

1.2 HashTable

HashTableHashMap类似,不同的是HashTable是线程安全的,它也是几乎的给所有的public方法都加上了sychronized关键字,还有一个不同点是:**HashTableK, V都不能是null,但是HashMap可以。**现在HashTable也是因为性能的问题,几乎没有人使用了。

二、Collections包装方法

由于ArrayListHashMap性能好,但是不是线程安全,所以Collections工具类中提供了相应的包装方法将他们包装成相应的线程安全的集合:

List<E> synchronizedList = Collections.sychronizedList(new ArrayList<E>());

Set<E> sychronizedSet = Collections.sychronizedSet(new HashSet<E>());

Map<K, V> synchronizedMap = Collections.sychronizedMap(new HashMap<K, V>());

Collections针对每种集合都声明了一个线程安全的包装类,在原集合的基础上添加了锁对象,集合中的每个方法都通过这个锁对象实现同步

三、java.util.concurrent包中的集合

3.1. ConcurrentHashMap

ConcurrentHashMapHashTable都是线程安全的集合,它们的不同主要是加锁粒度上的不同。HashTable的加锁方法是给每个方法加上synchronized关键字,这样锁的是整个对象。而ConcurrentHashMap是有更细粒度的锁。在JDK1.8之前,ConcurrentHashMap加的是分段锁,即Segment,每个Segment含有整个table的一部分,这样不同分段之间的并发操作就互不影响。
JDK1.8之后对此进行了进一步的改进,取消了Segment,直接在table元素上加锁,实现对每一行加锁,进一步减小了并发冲突的概率。

3.2 CopyOnWriteArrayList和CopyOnWriteArraySet

针对涉及到数据修改的部分,都会使用ReentrantLock锁住操作,并将修改或添加的元素,通过拷贝的方式,加入数组中,最后修改数组的引用为新复制的数组。读取时直接读取数组,不需要获取锁。

3.3 其他

初次之外还有ConcurrentSkipListMapConcurrentSkipListSetConcurrentLinkedQueueConcurrentLinkedDeque等,可以在java.util.concurrent下查看其他的线程安全的数据结构。至于为什么没有ConcurrentArrayList,原因是无法设计一个通用的而且可以规避ArrayList的并发瓶颈的线程安全的集合类,只能锁住整个list,这个用Collections里的包装类就能办到。

参考

  1. Java线程安全的集合详解

作者:EddieTries
来源链接:https://blog.csdn.net/TsuiXh/article/details/123503622

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/java/42865.html

分享给朋友:

“Java线程安全的集合” 的相关文章

Java 常用工具类(21) : 计算百分比,去整数/小数

import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; /** * @Auther: liyue * @Date: 2018/8/31 15:31...

MD5工具类(java实现版)

MD5工具类(java实现版) 介绍 MD5(Message Digest Algorithm)加密算法是不对称的加密算法,因为其实不可逆的,实际上其不能算作加密算法, 因为其不可解密。其实现原理是基于Hash算法(简称散列函数)。...

java项目常用工具类之http请求工具类

jdk1.8+spring4.3.12 一、问题描述及试用场景: 在项目开发中,经常用调用http接口,下面是封装apache的httpclient工具类。 二、样例代码: package org.egg.utils; im...

Java IO工具类常用方法

常用的文件操作:包括文件拷贝、HTTP方式拷贝、文件下载等。  1.创建文件夹 /** * 创建文件夹 * @filePath:路径 */ public void MakeFolder(String folderPath){ File fi...

12款最常用的Java测试工具

Parasoft Jtest Jtest是Parasoft公司推出的一款针对java语言的自动化白盒测试工具,它通过自动实现java的单元测试和代码标准校验,来提高代码的可靠性。 Abbot Abbot是一款测试Java GUIs的JUnit扩展程序...

java中常用的日期工具类

java中常用的日期工具类

java中常用的日期工具类 日期相关的类: package net.yto.ofclacct.core.util; import java.text.ParseException; import java.text.SimpleDateF...

158 01 Android 零基础入门  03 Java常用工具类01 Java异常 02 异常概述 01 什么是异常?

158 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 01 什么是异常?

158 01 Android 零基础入门 03 Java常用工具类01 Java异常 02 异常概述 01 什么是异常? **本文知识点:什么是异常? ** 说明:因为时间紧张,本人写博客过程中只是对知识点的关键步骤进行了截图记录,没有对截图步骤进行详细的文字说明(后面博主...

Java中的随机数

Java中的随机数

标题 Random Random中的方法 技巧 案例应用 其他随机数 在Java中,随机数的概念从广义上将,有三种。...

164 01 Android 零基础入门  03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 04 终止finally执行的方法

164 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 04 终止finally执行的方法

164 01 Android 零基础入门 03 Java常用工具类01 Java异常 04 使用try…catch…finally实现异常处理 04 终止finally执行的方法 本文知识点:终止finally执行的方法 说明:因为时间紧张,本人写博客过程中只是对知识点的关...

java包小结

java.lang.*  提供利用 Java 编程语言进行程序设计的基础类。最重要的类是 Object(它是类层次结构的根)和 Class(它的实例表示正在运行的应用程序中的类)。java.util.*  包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。