并发容器

2021/01/06 posted in  并发工具

并发容器分类

List

只有一个实现类CopyOrWriteArrayList,写的时候将共享变量赋值一份出来,读操作完全无锁

实现原理

内部维护一个数组,成员变量array 指向这个内部数组,所有读操作都是基于这个array进行的,如果读的过程有写操作,则复制一份出来,然后在新复制的数组上进行增减操作,执行完后再将array指向这个新数组,读写并行,读操作一直是基于原数组进行的

注意事项

  1. 使用于写操作非常少的场景,并且能容忍短时间的读写不一致的问题
  2. 迭代器只支持读,不支持增删改

Map

Map接口主要有ConcurrentHashMap 和 ConcurrentSkipListMap,前者的key是无序的后者的key是有序的


注意事项

二者的key和value 都不能为空否则会报空指针异常;在并发读高的情况下如果ConcurrentHashMap性能不太好,可以考虑使用ConcurrentSkipListMap操作

Set

Set 接口的两个实现是 CopyOnWriteArraySet 和 ConcurrentSkipListSet,使用场景可以参考前面讲述的 CopyOnWriteArrayList 和 ConcurrentSkipListMap,它们的原理都是一样的

Queue

可以从两个维度划分,阻塞和非阻塞,单端和双端,阻塞用Blocking标识,单端用Queue双端用Deque

单端阻塞

其实现有 ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、LinkedTransferQueue、PriorityBlockingQueue 和 DelayQueue

  1. 内部队列是数组ArrayBlockingQueue
  2. 内部队列是链表LinkedBlockingQueue
  3. 内部不支持有队列SynchronousQueue
  4. LinkedTransferQueue 融合 LinkedBlockingQueue 和 SynchronousQueue 的功能,性能比 LinkedBlockingQueue 更好
  5. DelayQueue 支持延时出队

双端阻塞

其实现是 LinkedBlockingDeque

单端非阻塞

其实现是 ConcurrentLinkedQueue

双端非阻塞

其实现是 ConcurrentLinkedDeque

注意事项

只有ArrayBlockingQueue 和 LinkedBlockingQueue 是支持有界的,所以在使用其他无界队列时,一定要充分考虑是否存在导致 OOM 的隐患。