并发类容器

1.ConcurrentMap

(1)ConcurrentMap两个重要的实现:ConcurrentHashMap和ConcurrentSkipListMap(支持并发排序,弥补ConcurrentHashMap,类似TreeMap)

(2)ConcurrentHashMap与HashTable底层实现的不同

a.HashTable在进行增删改的时候,会把整个对象锁起来,不允许其他线程修改

b.ConcurrentHashMap里,有个segment的概念(意即分段),ConcurrentHashMap会分成很多段(最多支持16段),线程A修改段1的数据,不会影响线程B修改段2的数据。ConcurrentHashMap的粒度更细,所以比HashTable有更高的性能

(3)ConcurrentHashMap底层使用了大量的volatile关键字

2.Copy-On-Write容器,简称COW,是一种用于程序设计中的优化策略

(1)JDK的COW容器有2种:CopyOnWriteArrayList和CopyOnWriteArraySet

(2)COW在写入数据时,不直接往容器里写,而是先将当前容器进行Copy,复制出一个新的容器,然后往新的容器写入数据,操作完后,再将原容器的引用指向新容器。这样做的好处是可以对COW容器进行并发读而不需要加锁,因为当前容器不会添加任何袁术。COW修改操作时,会有一把锁,只允许一条线程操作

COW容器的设计原理是读写分离

(3)适用场景:读多写少的场景

3.并发Queue

(1)JDK提供了2套并发队列的实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,2种都继承自Queue

 (2)ConcurrentLinkedQueue

a.是一个适用于高并发场景下的对了,通过无锁的方式,实现高并发状态下的高性能,通常来说,性能好于BlockingQueue

b.队列遵循先进先出的原则

c.队列不允许有null元素

d.重要方法:

add()和offer()都是加入元素的方法(ConcurrentLinkedQueue中没任何区别)

poll():取出并删除头元素

peek():取出头元素节点

(3)BlockingQueue:有5种实现

offer与add的区别:在长度限定的情况下,如果增加元素时,超过限制,add方法会报错,offer方法不会,只是增加不成功

a.ArrayBlockingQueue

基于数组的阻塞队列实现,内部维护了一个定长数组,以便缓存队列的数据对象,内部没实现读写分离(即生产和消费不能完全并行),长度需要自定义,可以指定先进先出还是先进后出,有界队列

b.LinkedBlockingQueue

基于链表的阻塞队列,跟ArrayBlockingQueue类似,内部维护一个链表组成的缓冲数据队列,能高并发处理数据,运维内部采用分离锁,消费者和生产者能完全并行,无界队列

c.PriorityBlockingQueue

基于优先级的阻塞队列(优先级通过构造函数传入的Compator对象来决定),内部实现时,内部的控制线程同步的锁采用的是公平锁,无界队列

注意:其实PriorityBlockingQueue底层并没有排序,实现的原理是,一开始把优先级最高的放在队列头,获取元素时,就把元素获取出来并删除,然后把剩余里优先级最高的放在队列头(take方法)。原因是添加一次就排一次序很消耗性能

d.DelayQueue

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

e.SynchronousQueue

一种没有缓冲的队列,生产者产生的数据会直接被消费者获取并消费

注意:这种类型的队列,调用add方法不是往队列里塞东西,这种队列是没容量的,一定要有个线程有take方法,才能调add方法




posted @ 2018-05-18 14:04  无名草110  阅读(244)  评论(0编辑  收藏  举报