同步容器

如何将非线程安全的容器变成线程安全的容器? – 把非线程安全的容器封装在对象内部, 然后控制访问路径. 性能差

并发容器

List

CopyOnWriteArrayList 写的时候将共享变量复制一份出来, 读操作完全无锁. 写时先将当前数组复制一个, 在新复制的数组上进行添加元素, 添加完成后指向新的数组.而读操作在指向新数组之前都是基于旧数组, 所以会出现短暂的读写不一致. 适合写操作比较少的场景.

Map

两个实现 ConcurrentHashMap 和 ConcurrentSkipListMap

ConcurrentHashMap

key 无序 不能为null value 不能为null

ConcurrentSkipListMap

插入 删除 查询操作平均的时间复杂度是 O(log n), 理论上和并发线程数没有关系.

Set

CopyonwriteArraySet 和 ConcurrentSkipListSet

CopyonwriteArraySet

写操作比较少的场景

ConcurrentSkipListSet

Queue

分为阻塞和非阻塞

单端和双端

单端阻塞队列

ArrayBlockingQueue 支持有界 LinkedBlockingQueue 支持有界 SynchronousQueue LinkedTransferQueue PriorityBlockingQueue DelayQueue

双端阻塞队列

LinkedBlockingDeque

单端非阻塞队列

ConcurrentLinkedQueue

双端非阻塞队列

ConcurrentLinkedDeque

无界队列可能引发 OOM 的隐患