并发容器(粗略)
并发容器
1.概述
为了线程池做准备,线程池里有一个参数就是用并发容器来做你工作任务的容器。
容器分类

从物理结构来说,数据结构就两种
-
数组
-
链表
从逻辑结构来说,就很多了
为啥有了List,Set,后面还要加一个Queue?
List,Set就是用来普通装东西的,Queue主要是为高并发准备的
2.ConcurrentHashMap
发展:从HashTable到ConcurrentHashMap
jdk1.0: 就两个容器 Vector(collection) HashTable(map) 所有方法都加了sychronized,目前基本不用
后面加了:
- HashMap(所有方法都没加锁)---》
- 工具类Collections.synchronizedCollection(new HashSet<>()),底层还是 sychronized,只是用了sychronized锁一个对象,可以调节锁的粒度。
- ConcurrentHashMap(效率主要提高在并发读上面 效率很高 )
3.Vector到Queue的发展
多线程操作collection容器时 多考虑QUEUE少考虑List
ConcurrentLinkedDeque---》原子性是通过CAS实现
4.经常在多线程情况下使用的容器
-
**map: **
-
ConcurrentHashMap
-
ConcurrentSkipListMap(跳表实现,可以排序 )
-
-
collection:
-
copyOnWriteArrayList 写时复制一个数组往后添加,完成后原来的引用指向新的数组。(读不加锁 写加锁),适合读多写少的场景‘
-
copyOnWriteArrayList
-
BlockingQueue(接口) --- 提供了许多对多线程场景支持,友好的API(Queue和List区别)
-
LinkedBlockingDeque:无界,可以一直添加(但是不能超过int的最大值), put take方法会阻塞 ArrayBlockingQueue: 有界,put阻塞 add抛异常 offer不会抛异常,返回true或者false
-
-
TreeMap:排好序的 用的红黑树(查找比较快 插入相率也相对没那么低),
为什么没有ConcurrentTreeMap?
- ConcurrentHashMap 用的CAS操作,这个CAS用在红黑树结构的话实现太复杂……
- 所以用了跳表结构ConcurrentSkipListMap 在高并发下来替代 TreeMap, 排好序
跳表结构:
- 查找比链表快很多 CAS的实现难度比TreeMap小很多
5.阻塞队列中比较特殊的几个队列
特殊的QUeue
PriorityQueue(非阻塞队列) : 添加的时候会默认排序(小到大) 二叉树
BlockingQueue(接口):
DelayQueue: 按时间进行任务调度
SynchronousQueue : 容量为0.. 不能装东西 阻塞 使用场景:线程直接交换数据,交换不到的话就一直阻塞
TransferQueue:装了一个数据后 会阻塞,等着这个数据被消费 才会继续往下执行 (你付了钱我再走)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY