Java集合系列之并发包(java.util.concurrent)下的高级集合类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lkp1603645756/article/details/85016035

先看一张描述java.util.concurrent包下集合组成结构的类图

下列介绍的集合统一特性:线程安全,支持并发操作

非阻塞队列(队列无数据,操作队列产生异常或返回null,不具备等待/阻塞的特色)

ConcurrentHashMap:相对于线程安全的HashTable,优势在于HashTable不支持在循环(iterator)中对结构调整(增、删),否则会有ConcurrentModificationException异常。采用了分段锁的设计, 将一个HashMap分成N段,使用key的hashCode来确定分配到那个字段,只有在同一分段内才存在竞态关系,每个分段相当于一个HashTable,执行效率相当于提升了N倍。

ConcurrentSkipListMap:支持排序。

ConcurrentSkipListSet:支持排序且不允许重复元素。

注:上面两个,排序的实现要求集合中的对象实现Comparable接口,不重复的实现为重写hashCode和equals方法

ConcurrentLinkedQueue:队列操作(只操作队头),poll() / peek() / element()

ConcurrentLinkedDeque:双端队列(支持操作队头和队尾),pollFirst() / pollLast()

CopyOnWriteArrayList:适用于读操作>>写操作的情况。在写时拷贝,也就是如果需要对CopyOnWriteArrayList的内容进行改变,首先会拷贝一份新的List并且在新的List上进行修改,最后将原List的引用指向新的List。线程安全地遍历,因为如果另外一个线程在遍历的时候修改List的话,实际上会拷贝出一个新的List上修改,而不影响当前正在被遍历的List。ArrayList非线程安全

CopyOnWriteArraySet:HashSet非线程安全

阻塞队列(取空队列需要等待直到有元素,塞满队列需要等待直到有空间)

ArrayBlockingQueue:有界阻塞队列

LinkedBlockingQueue:无界阻塞队列,基于单向链表的实现

PriorityBlockingQueue:无界有序的阻塞队列,基于数组

SynchronousQueue:同步队列,插入需等待移除,移除需等待插入 

DelayQueue:延时执行任务的队列,集合元素需实现java.util.concurrent.Delayed接口

LinkedTransferQueue:与SynchronousQueue功能类似,但有嗅探功能,能尝试性的添加数据(tryTransfer()方法)

知识扩展:什么是CopyOnWrite容器?

CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

猜你喜欢

转载自blog.csdn.net/lkp1603645756/article/details/85016035