Java多线程——并发容器简介

来源:互联网 发布:.lol域名备案 编辑:程序博客网 时间:2024/04/28 23:49

这里主要是简单介绍几种比较常见的并发容器,目的是梳理一下。由于每一个类的底层实现都是非常复杂的,用到了很多精妙的多线程的技巧,限于篇幅和水平,就不做深入的探讨。纸上得来终觉浅,只有多加实践,多看源码,才能深入理解它们。


一、ConcurrentHashMap

提供高并发性的线程安全的HashMap,实现了的HashMap的功能,并且实现了接口ConcurrentMap所定义的原子的putIfAbsent, remove和replace方法。ConcurrentHashMap把整个哈希表分成多个segment,主要通过锁分段技术减小了锁的粒度,降低了冲突,从而提高了并发性。在实际的应用中,散列表一般是读多写少。ConcurrentHashMap 就针对读操作做了大量的优化,运用了很多并发技巧,如不可变对象和使用volatile保证内存可见性,这样,在大多数情况下读操作甚至无需加锁也能获得正确的值。

另外还有ConcurrentSkipListMap/Set,实现了NavigableMap。插入之后的元素是有序的,插入,读取,删除的期望效率是log(n)。


二、CopyOnWriteArrayList

是线程安全的ArrayList,其所有写操作都是通过对底层数组进行一次新的复制来实现的,代价昂贵,适合读多写少的情况。另外,正是由于它通过复制的实现方式,CopyOnWriteArrayList提供了一种特别的功能:快照。如果你恰好有这样的需求,CopyOnWriteArrayList将会是一个很好的选择。


三、ConcurrentLinkedQueue

线程安全的基于Linked List 实现的非阻塞的无限队列。提供非实时数据。


四、BlockingQueue系列

Queue是适合生产消费模式的数据结构。顾名思义,实现这个接口的都是阻塞队列。

成员有:LinkedBlockingQueue、DelayQueue、LinkedTransferQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue……


五、总结

不同的数据结构有不同的特点和作用,结合实际生产中的场景使用合适的数据结构是很重要的。我大概总结了一下几个比较有特征的:


1. 需要获取快照而非实时的信息时使用的数据结构。

2. 生产消费模式中大量使用的数据结构。

3. 读多写少的时候,对针对读取进行了优化(可能导致弱一致性)的数据结构。


另外,在现实使用中的应该考虑到实际的并发性,从而为并发容器设计合适的参数。比如所ConcurrentHashMap的concurrentLevel(默认值为16),设置过高会照成空间的浪费,设置过低会降低并发性。这种对调优的把握是要通过对底层实现的深刻理解和不断的实践积累才能获取的。

1 0
原创粉丝点击