Java concurrency之集合_动力节点Java学院整理
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的框架如下图所示:
(01) copyonwritearraylist相当于线程安全的arraylist,它实现了list接口。copyonwritearraylist是支持高并发的。
(02) copyonwritearrayset相当于线程安全的hashset,它继承于abstractset类。copyonwritearrayset内部包含一个copyonwritearraylist对象,它是通过copyonwritearraylist实现的。
2. map
juc集合包中map的实现类包括: concurrenthashmap和concurrentskiplistmap。它们的框架如下图所示:
(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。它们的框架如下图所示:
(01) arrayblockingqueue是数组实现的线程安全的有界的阻塞队列。
(02) linkedblockingqueue是单向链表实现的(指定大小)阻塞队列,该队列按 fifo(先进先出)排序元素。
(03) linkedblockingdeque是双向链表实现的(指定大小)双向并发阻塞队列,该阻塞队列同时支持fifo和filo两种操作方式。
(04) concurrentlinkedqueue是单向链表实现的*队列,该队列按 fifo(先进先出)排序元素。
(05) concurrentlinkeddeque是双向链表实现的*队列,该队列同时支持fifo和filo两种操作方式。
推荐阅读