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