欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java concurrency之集合_动力节点Java学院整理

程序员文章站 2023-12-16 22:42:04
java集合包 java集合主体内容包括collection集合和map类;而collection集合又可以划分为list(队列)和set(集合)。 1. li...

java集合包

java集合主体内容包括collection集合和map类;而collection集合又可以划分为list(队列)和set(集合)。

1. list的实现类主要有: linkedlist, arraylist, vector, stack。

(01) linkedlist是双向链表实现的双端队列;它不是线程安全的,只适用于单线程。

(02) arraylist是数组实现的队列,它是一个动态数组;它也不是线程安全的,只适用于单线程。

(03) vector是数组实现的矢量队列,它也一个动态数组;不过和arraylist不同的是,vector是线程安全的,它支持并发。

(04) stack是vector实现的栈;和vector一样,它也是线程安全的。 

2. set的实现类主要有: hastset和treeset。

(01) hashset是一个没有重复元素的集合,它通过hashmap实现的;hashset不是线程安全的,只适用于单线程。

(02) treeset也是一个没有重复元素的集合,不过和hashset不同的是,treeset中的元素是有序的;它是通过treemap实现的;treeset也不是线程安全的,只适用于单线程。 

3.map的实现类主要有: hashmap,weakhashmap, hashtable和treemap。
(01) hashmap是存储“键-值对”的哈希表;它不是线程安全的,只适用于单线程。

(02) weakhashmap是也是哈希表;和hashmap不同的是,hashmap的“键”是强引用类型,而weakhashmap的“键”是弱引用类型,也就是说当weakhashmap 中的某个键不再正常使用时,会被从weakhashmap中被自动移除。weakhashmap也不是线程安全的,只适用于单线程。

(03) hashtable也是哈希表;和hashmap不同的是,hashtable是线程安全的,支持并发。

(04) treemap也是哈希表,不过treemap中的“键-值对”是有序的,它是通过r-b tree(红黑树)实现的;treemap不是线程安全的,只适用于单线程。

更多关于这些集合类的介绍,可以参考“java 集合系列目录(category)”。

为了方便,我们将前面介绍集合类统称为”java集合包“。java集合包大多是“非线程安全的”,虽然可以通过collections工具类中的方法获取java集合包对应的同步类,但是这些同步类的并发效率并不是很高。为了更好的支持高并发任务,并发大师doug lea在juc(java.util.concurrent)包中添加了java集合包中单线程类的对应的支持高并发的类。例如,arraylist对应的高并发类是copyonwritearraylist,hashmap对应的高并发类是concurrenthashmap,等等。

juc包在添加”java集合包“对应的高并发类时,为了保持api接口的一致性,使用了”java集合包“中的框架。例如,copyonwritearraylist实现了“java集合包”中的list接口,hashmap继承了“java集合包”中的abstractmap类,等等。得益于“juc包使用了java集合包中的类”,如果我们了解了java集合包中的类的思想之后,理解juc包中的类也相对容易;理解时,最大的难点是,对juc包是如何添加对“高并发”的支持的!

juc中的集合类

下面,我们先了解juc包中集合类的框架;为了方便讲诉,我将juc包中的集合类划分为3部分来进行说明。在简单的了解juc包中集合类的框架之后,后面的章节再逐步对各个类进行介绍。

1. list和set

juc集合包中的list和set实现类包括: copyonwritearraylist, copyonwritearrayset和concurrentskiplistset。

concurrentskiplistset稍后在说明map时再说明,copyonwritearraylist 和 copyonwritearrayset的框架如下图所示:

Java concurrency之集合_动力节点Java学院整理

(01) copyonwritearraylist相当于线程安全的arraylist,它实现了list接口。copyonwritearraylist是支持高并发的。

(02) copyonwritearrayset相当于线程安全的hashset,它继承于abstractset类。copyonwritearrayset内部包含一个copyonwritearraylist对象,它是通过copyonwritearraylist实现的。

2. map

juc集合包中map的实现类包括: concurrenthashmap和concurrentskiplistmap。它们的框架如下图所示:

Java concurrency之集合_动力节点Java学院整理

(01) concurrenthashmap是线程安全的哈希表(相当于线程安全的hashmap);它继承于abstractmap类,并且实现concurrentmap接口。concurrenthashmap是通过“锁分段”来实现的,它支持并发。

(02) concurrentskiplistmap是线程安全的有序的哈希表(相当于线程安全的treemap); 它继承于abstractmap类,并且实现concurrentnavigablemap接口。concurrentskiplistmap是通过“跳表”来实现的,它支持并发。

(03) concurrentskiplistset是线程安全的有序的集合(相当于线程安全的treeset);它继承于abstractset,并实现了navigableset接口。concurrentskiplistset是通过concurrentskiplistmap实现的,它也支持并发。

3. queue

juc集合包中queue的实现类包括: arrayblockingqueue, linkedblockingqueue, linkedblockingdeque, concurrentlinkedqueue和concurrentlinkeddeque。它们的框架如下图所示:

Java concurrency之集合_动力节点Java学院整理

(01) arrayblockingqueue是数组实现的线程安全的有界的阻塞队列。

(02) linkedblockingqueue是单向链表实现的(指定大小)阻塞队列,该队列按 fifo(先进先出)排序元素。

(03) linkedblockingdeque是双向链表实现的(指定大小)双向并发阻塞队列,该阻塞队列同时支持fifo和filo两种操作方式。

(04) concurrentlinkedqueue是单向链表实现的*队列,该队列按 fifo(先进先出)排序元素。

(05) concurrentlinkeddeque是双向链表实现的*队列,该队列同时支持fifo和filo两种操作方式。

上一篇:

下一篇: