阻塞队列BlockingQueue学习
2023-07-03 11:47:07 8 举报
AI智能生成
登录查看完整内容
常见阻塞队列BlockingQueue的了解
作者其他创作
大纲/内容
有界的阻塞队列,先进先出,存取相互排斥
容量固定必须指定长度,没有扩容机制
没有元素的位置也占用空间,被null占位
数据结构:静态数组
存取是同一把锁,操作的是同一个数组对象,存取相互排斥
锁:ReentrantLock
出队:队列count=0,无元素可取时,该对象阻塞
notEmpty
入队:队列count = length时,无法存放元素,该对象阻塞
notfull
阻塞对象
唤醒notEmpty
从队首开始添加元素,记录putIndex(到队尾设置为0)
入队
唤醒notfull
从队首开始取出元素,记录takeIndex(到队尾设置为0)
出队
两个指针putIndex,takeIndex都是从队首向队尾移动,保证队列的先进先出原则
ArrayBlockingQueue
无界的阻塞队列,默认长度为int的最大值,可以指定容量 ,先进先出,存取不排斥
默认无界,可以指定容量
内部类Node存储元素
数据结构:链表
takeLock:取Node节点保证前驱后继不会乱
putLock:存Node节点保证前驱后继不会乱
锁分离:有两个ReentrantLock,存取锁分离,删除元素时两个锁一起加
入队:队列count = capacity时,无法存放元素,该对象阻塞
阻塞对象
队尾入队,由last指针记录
队首入队,由head指针记录
存取锁分离,减少锁竞争,性能更高
线程池中为什么使用LinkedBlockingQueue而不是使用ArrayBlockingQueue
LinkedBlockingQueue
一个使用优先级队列实现的无界阻塞队列
没有阻塞功能的优先级队列
数据结构:PriorityQueue
Condition available
不阻塞,无界队列,与优先级队列入队相同,available
为空时阻塞
小于等于0则出队
不为空,则已有线程阻塞,直接阻塞
为空,则将当前线程职位leader,并按照过期时间阻塞
判断leader线程是否为空(为了保证优先级)
大于0,说明没过期,则阻塞
检查堆顶元素过期时间
订单超时
异步短信通知
缓存过期清除
应用场景
DelayQueue
阻塞队列BlockingQueue学习
0 条评论
回复 删除
下一页