线程基础(二十八)
本文作者:王一飞,叩丁狼高级讲师。原创文章,转载请注明出处。
到这, 线程的并发容器介绍就完成了, 来做一个大总结:
List集合
SynchronizedList :一个由普通list转换而来的线程安全集合
List list = Collections.synchronizedList(new LinkedList(...));
CopyOnWriteArrayList :一种读写安全的ArrayList集合
CopyOnWriteArrayList类是线程安全的容器,但它的安全是有一定的限制的。他的线程安全操作针对是并发环境下线程读与写安全。简单的讲, 它只能保证, 一边线程主读(遍历/获取), 一边线程主写(添加/删除/修改)操作上的安全。如果一边线程读写复合操作,另一边线程也读写复合操作,那它也无能为力啦。
Map集合
SynchronizedMap:一个由普通Map转换而来的线程安全map集合
Map synchronizedMap = Collections.synchronizedMap(new HashMap());
ConcurrentHashMap:jdk7以前:一种将Map分段(Segment)锁定的线程按照Map jdk8以后:一种使用Node + CAS + Synchronized 保证安全的Map
jdk7以前:
ConcurrentHashMap和HashMap设计思路差不多,但是为支持并发操作,做了一定的改进,ConcurrentHashMap引入Segment 的概念,目的是将map拆分成多个Segment(默认16个)。操作ConcurrentHashMap细化到操作某一个Segment。在多线程环境下,不同线程操作不同的Segment,他们互不影响,这便可实现并发操作。
jdk8以后:
jdk8版本的ConcurrentHashMap直接抛弃了Segment的设计,采用了较为轻捷的Node + CAS + Synchronized技术组合设计,保证线程安全。
Queue队列
阻塞类:
ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
ArrayBlockingQueue 底层是一个有界数组,遵循FIFO原则,对进入的元素进行排序,先进先出。其使用ReentrantLock锁,再配合两种Condition实现队列的线程安全操作。并发环境下ArrayBlockingQueue 使用频率较高,另外,其还支持公平与非公平2种操作策略,在创建对象时通过构造函数将fair参数设置为true/false即可,需要注意的是,如果fair设置为false,表示持有公平锁,这种操作会降低系统吞吐量,慎用。
LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
LinkedBlockingQueue 一个基于链表而实现的有界阻塞队列。遵循先进先出原则,由队头入列,再从队尾出列。具体操作上跟ArrayBlockingQueue类似,区别在于底层维护数据上,LinkedBlockingQueue底层是一个链接,而ArrayBlockingQueue是一个数组。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
LinkedBlockingDeque 跟LinkedBlockingQueue 实现原理一样,区别是它是双向的
PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
PriorityBlockingQueue 是有一个带有优先级级别的无界阻塞队列,不支持null元素入列,并且要求队列对象必须为可以比较对象。这点跟PriorityQueue类 类似,区别是PriorityBlockingQueue 带有阻塞功能。
DelayQueue:一个具有延时等待效果无界阻塞队列。
DelayQueue一个无界阻塞队列,里面元素都实现Delayed接口,要求实现延期策略方法(getDelay)。在操作队列时,只有在延迟期满时才能从队列中提取元素。如果所有元素延迟都还没有期满,则队列没有头部,使用poll时将返回 null。当元素到期,而该元素不是头部元素,继续等待.
SynchronousQueue:一个不存储元素的阻塞队列。
SynchronousQueue一个不存储元素的阻塞队列,支持公平锁和非公平锁.每一次操作必须配置,即一次put操作必须等待一次take操作,否则不能添加元素。
非阻塞类:
ConcurrentLinkedQueue:一个基于链表的无界线程安全的队列
ConcurrentLinkedQueue 是一个基于链接节点的无界线程安全的队列,按照先进先出原则对元素进行排序。新元素从队列尾部插入,而获取队列元素,则需要从队列头部获取。
PriorityQueue:一个基于优先级的无界线程不安全队列
PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。