并发编程:同步类容器、并发类容器

一、同步类容器的种类

1、Vector

Vector实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synchronized方法,即进行了同步措施。

2、HashTable

HashTable实现了Map接口,它和HashMap很相似,但是HashTable进行了同步处理,而HashMap没有。

二、同步类容器的缺陷

在对同步类容器进行迭代修改是,会抛出ConcurrentModificationException异常。

参考链接:https://www.cnblogs.com/dolphin0520/p/3933404.html

三、并发类容器

1、ConcurrentHashMap

ConcurrentMap接口有两个重要实现:ConcurrentHashMap和ConcurrentSkipListMap(支持并发排序功能,弥补了ConcurrentHashMap)。

ConcurrentHashMap内部使用段(Segment)来表示不同的部分,每一个段其实是一个小的HashTable,它们有自己的锁。只要修改操作发生在不同的段上,就可以实现并发操作。一个整体分成16个段,最高支持16个线程的并发修改操作。通过减少锁的粒度从而降低锁竞争。代码中大量使用volatile关键字声明,可以第一时间获取修改内容,性能很好。

2、Copy-On-Write简称COW

JDK中COW容器有两种:CopyOnWriteArrayList和CopyOnWriteArraySet。

什么是CopyOnWrite容器?

当往容器中添加元素的时候,不直接向当前容器中添加元素,而是复制一份一模一样的当前容器,在新的容器里面添加元素,添加完元素后,将原容器的引用指向新的容器。这样做的好处是可以对CopyOnWrite容器进行并发的读,而不需要加锁。CopyOnWrite容器是一种读写分离的思想。     该容器适合于读多写少的场景。

非阻塞队列

1、ConcurrentLinkedQueue

ConcurrentLinkedQueue是一种适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。它是一个基于链接节点的无界线程安全队列,遵循先进先出的原则,该队列不允许null元素。

ConcurrentLinkedQueue重要方法:

add()和offer()都是加入元素的方法(在ConcurrentLinkedQueue,这两个方法没区别)。

poll()和peek()都是取头元素结点,区别在于poll()会删除元素,peek()不会删除元素。

阻塞队列

1、ArrayBlockingQueue

基于数组实现的阻塞队列,在ArrayBlockingQueue内部维护着一个定长的数组,来缓存队列中的数据对象,内部没有实现读写分离,也就意味着生产和消费不能完全并行,长度是需要定义的,可以指定先进先出或先进后出,也叫有界队列。

2、LinkedBlockingQueue

基于链表的阻塞队列,LinkedBlockingQueue之所以能够高效的处理并发数据,是因为其内部实现采用分离锁(读写分离两个锁),从而实现生产者和消费者完全并行。它是一种无界队列。

3、SynchronousQueue

没有缓冲的队列,生产者生产的数据会被消费者直接消费。

4、PriorityBlockingQueue(调用take方法的时候会对队列中的元素进行排序)

基于优先级的阻塞队列(优先级的判断通过构造函数传入的Compator对象来决定,传入队列的对象必须实现Comparable接口),实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁,它是一种无界队列。

5、DelayQueue

带有延迟时间的队列,其中的元素只有当其指定的延迟时间到了,才能够从队列中获取元素。DelayQueue中的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、任务超时处理、空闲连接的关闭等等。

6、在阻塞队列中put、offer、add三种方法的区别

offer:如果队列满了直接返回false

put:如果队列满了会阻塞,直到收到通知

add:1、如果队列满了直接返回(不阻塞)直接报错 2、内部实际上调用的是offer方法

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章