Java 并发编程工具类 5 并发容器
同步容器
如何将非线程安全的容器变成线程安全的容器? – 把非线程安全的容器封装在对象内部, 然后控制访问路径. 性能差
并发容器
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 的隐患