并发容器分类

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

内部维护一个数组,成员变量array 指向这个内部数组,所有读操作都是基于这个array进行的,如果读的过程有写操作,则复制一份出来,然后在新复制的数组上进行增减操作,执行完后再将array指向这个新数组,读写并行,读操作一直是基于原数组进行的
注意事项
- 使用于写操作非常少的场景,并且能容忍短时间的读写不一致的问题
- 迭代器只支持读,不支持增删改
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

- 内部队列是数组ArrayBlockingQueue
- 内部队列是链表LinkedBlockingQueue
- 内部不支持有队列SynchronousQueue
- LinkedTransferQueue 融合 LinkedBlockingQueue 和 SynchronousQueue 的功能,性能比 LinkedBlockingQueue 更好
- DelayQueue 支持延时出队
双端阻塞
其实现是 LinkedBlockingDeque

单端非阻塞
其实现是 ConcurrentLinkedQueue
双端非阻塞
其实现是 ConcurrentLinkedDeque
注意事项
只有ArrayBlockingQueue 和 LinkedBlockingQueue 是支持有界的,所以在使用其他无界队列时,一定要充分考虑是否存在导致 OOM 的隐患。
