并发编程:并发类容器

        前面学到了JDK1.5版本以前的同步类容器及Collections.synchronizedXXX等方法,现在来学习JDK1.5版本以后对应并发编程的容器--并发类容器。

        并发类容器是专门针对并发而设计的,它们在保障线程安全的同时,也尽可能的保证了并发性。在并发编程中,传统的HashTable被ConcurrentHashMap替代、Vector被CopyOnWriteArrayList替代,以及并发的CopyOnWriteArraySet、队列(高性能的Queue、阻塞形式的ConcurrentLinkedQueue、LinkedBlockingQueue、ArrayBlockingQueue等)。

一、ConcurrentMap接口下有两个重要的实现:ConcurrentHashMap、ConcurrentSkipListMap(支持并发排序功能)。           

        ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每一个Segment就是一个小的HashTable,他们有自己的锁。只要多个修改操作发生在不同的Segment上,他们就可以并发进行(把一个整体分成16个Segment,则表示最高支持16个线程并发修改操作)。代码中大多共享变量都使用Volatile关键字声明,也使其性能保持良好。

 

 二、CopyOnWrite,简称COW,JDK自带的COW容器有两种:CopyOnWriteArrayList和CopyOnWriteArraySet。

        COW一种用于程序设计中的优化策略,当往容器添加元素时,不直接添加进容器,而是先将当前容容器进行copy,复制出一个新的容器,将要添加的数据添加到这个新的容器,当添加成功后再将指向原来容器的引用指向这个新的容器,这样就使得读取数据时可以支持并发而不用加锁,而在对容器进行写入操作时则添加ReentrantLock锁来保证数据并发写入的安全性,数据的读取和写入被分开来进行。

 

 三、并发Queue,JDK提供了两套实现,一种是以ConcurrentLinkedQueue为代表的高性能队列,一种是以BlockingQueue接口为代表的阻塞队列。

ConcurrentLinkedQueue队列:

        ConcurrentLinkedQueue:通过无锁的方式,实现高并发下的高性能。他是一个基于连接节点的无界线程安全队列,该队列遵循先进先出的原则且不允许null元素。ConcurrentLinkedQueue的重要方法有加入(add()、offer())/取出(boll()、peek())。add()和offer()两个方法都是往ConcurrentLinkedQueue队列中加入数据,两者之间几乎没有实质性的区别;boll()方法和peek()方法都是取出队列里边的数据,boll()取出数据后会从该队列中删除该元素,peek()则仅仅是取出该数据而不会在队列中删除该元素。

阻塞队列:实现BlockingQueue接口的队列有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlockingQueue、DelayQueue。

       ArrayBlockingQueue:基于数组的阻塞队列实现,在ArrayBlockingQueue内部维护了一个定长数组以便缓存队列中的数据对象,其内部没有实现读写分离,即生产和消非不能完全并行,长度是需要定义的,可以指定为先进先出或现金后出的模式。其也称作有界队列。

       LinkedBlockingQueue:基于链表的阻塞队列,类似ArrayBlockingQueue,其内部也维持着一个数据缓冲队列(此队列有链表构成),其内部采用分离锁(读写分离两个锁),从而实现生产者和消非这的完全并行。不同于ArrayBlockingQueue这样的队列,LinkedBlockingQueue是一个无界队列。

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

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

       DelayQueue:带有延迟时间的Queue,该队列中的元素只有在其指定的延迟时间到了,才能够获取。传入DelayQueue队列的元素必须实现Delay接口。DelayQueue是一个没有大小限制的队列,其广泛运用在诸如对缓存超时的数据进行移除、任务超时处理、空闲连接的关闭等场景。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值