JAVA绝对干货——List、Set、Map并发数据结构对比实现

JAVA并发数据结构对比实现

在对List、Set、Map并发应用场合,我们可以使用Collections的下面方法将非线程安全List、set、Map转化为线程安全的。但是效率并不是最好的,JDK提供了专门的线程安全List与Set实现类,后面我们将讨论下他们的具体实现。

一、CopyOnWriteArrayList与Vector实现讨论

CopyOnWriteArrayList与Vector是两个线程安全的List,ArrayList不是线程安全的。下面我们对比下这两个线程安全List的实现方式有什么不同,各有什么优点与缺点。

1. CopyOnWriteArrayList get()方法实现如下图

CopyOnWriteArrayList get方法没有进行任何锁。所以效率要高。

2. Vector的get方法实现如下:

Vector的get方法增加了锁,所以对比两者get方法的,可以说明CopeOnWriteArrayList读取更高效。

3. 下面我们对比Vector与CopyOnWriteArrayList 在添加数据方面的实现方法对比。

Vector 的add()方法实现如下图:

4. CopyOnWriteArrayList 的add()方法实现如下图:

CopyOnWriteArrayList add方法实现是先进行锁定,再拷贝数组,添加新元素后,再写入,相比Vector单纯的锁定比,CopyOnWriteArrayList 添加方法效率应该低些。所以

并发写多情况下建议用Vector,并发读多的情况下建议用CopyOnWriteArrayList 。

二、并发Set

CopyOnWriteArraySet是实现了Set接口线程安全的。内部依赖于CopyOnWriteArrayList,因此适合读多写少的并发。

三、并发Map

JDK提供了高并发的Map实现ConcurrentHashMap.它的get是无锁的,但是put是有锁的。

四、并发Queue

ConcurrentLinkedQueue是一个适用于高并发场景下 队列。它通过无锁的方式,实现了高并发状态下的高性能,通常它的性能好于BlockingQueue的典型实现ArrayBlockingQueue、LinkedBlockingQueue.

五、并发Deque

Deque是一个种双端队列,可以在头部或尾部进行出队入队。

实现类有 ArrayDeque、LinkedBlockingDeque.

其中LinkedBlockingDeque是线程安全的,但是读写都加锁,所以效率不是特别高。

时间: 2024-12-15 21:05:22

JAVA绝对干货——List、Set、Map并发数据结构对比实现的相关文章

纯数据结构Java实现(5/11)(Set&Map)

纯数据结构Java实现(5/11)(Set&Map) Set 和 Map 都是抽象或者高级数据结构,至于底层是采用树还是散列则根据需要而定. 可以细想一下 TreeMap/HashMap, TreeSet/HashSet 的区别即可 只定义操作接口(操作一致),不管具体的实现,所以即便底层是 BST 亦可(只是效率不高) (我还是直说了吧,如果不要求有序,尽量用 Hash 实现的吧) 集合(Set) 二分搜索树不存放重复元素,所以 BST 就是一个很好的用于实现集合的底层结构 常见应用 其实主要

并发编程 — 并发数据结构

由于并行程序与串行程序的不同特点,适用于串行程序当中的常用数据结构在并发环境中会引发线程安全问题,例如ArrayList,HashSet,HashMap等,这是因为这些数据结构不是线程安全的,所以编写并行程序时需要将原串行数据结构转换为线程安全或使用对并行程序效率更高的并行数据结构 使传统集合更改为线程安全集合 Java代码   public class TestMain { @Test public void testTraditionCollections() throws Exceptio

[转]Java多线程干货系列—(一)Java多线程基础

Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的执行单元线程本身依靠程序进行运行线程是程序中的顺序控制流,只能使用分配给程序的资源和环境 2 进程:执行中的程序一个进程至少包含一个线程 3 单线程:程序中只存在一个线程,实际上主方法就是一个主线程 4

Java中的Collection和Map(二)--List体系

正如我们在Java中的Collection和Map(一)中所看到的那样,我们经常使用的有ArrayList.LinkedList.Vector.Stack.这里不再累述它们的使用方法,这里主要是说一下他们的底层结构以及使用时机. 1.ArrayList 我们都知道ArrayList是我们经常使用的List集合之一.我们在使用的时候经常通过 new ArrayList() 方法来创建一个ArrayList集合,然后调用它的 add(E e) 方法向集合中存储元素.那么你是否了解当我们使用 new

【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别

原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别. 经常会看到程序中使用了记录集,常用的有Collection.HashMap.HashSet.ArrayList,因为分不清楚它们之间的关系,所以在使用时经常会混淆,以至于不知道从何下手.在这儿作了一个小例

黑马程序员——Java集合基础知识之Map

Map概念 要同时存储两个元素Key和Value,他们之间有映射关系,每个键不能重复,每个键只能映射到一个值. 当数据之间存在映射关系的时候,考虑使用Map集合. Map常用方法 如果添加的键原来有值,后添加的值会覆盖前面的值,并返回之前的值.put会返回来先添加的值,后添加的值会覆盖原有的值. Map tm =new TreeMap(); tm.put (key, value);//MAP没有add tm.remove (key) ;//去除一个key和对应的value,若不存在key返回nu

java 容器Collection List Set Map概述

对JAVA的集合的理解是想对于数组 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法. Set 和

Java 面试知识点解析(二)——高并发编程篇

前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧. 前序文章链接: Java 面试知识点解析(一)--基础知识篇 (一)高并发编程基础知识 这里涉及到一些基础的概念,我重新捧起了一下<实战 Java 高并发程序设计>这一本书,感觉到心潮澎湃,这或许就是笔者叙述功底扎实的

推荐:7 月份值得一看的 Java 技术干货!

月底了,又到了我们总结这一个月 Java 技术干货的时候了,又到了我们给粉丝免费送书的日子了. 7 月份干货总结 Oracle 发布了一个全栈虚拟机 GraalVM 一文带你深入拆解 Java 虚拟机 图文带你了解 8 大排序算法 Spring Boot 2.x 新特性总结及迁移指南 Spring Boot 核心配置文件详解 Spring Boot 配置随机数那些小技巧 Java 8 之 Stream 流(一)流基础体验 Java 8 之 Stream 流(二)关键知识点 微服务架构及分布式事务