关于队列的小知识

简介: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

theme: smartblue

队列是常用的数据结构之一,是一种先入先出(First Input First Output)的结构。

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

使用场景

队列一般用于生产者-消费者模式。队列有阻塞队列和非阻塞队列,两者区别为当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。这两者都能用于生产者-消费者模式,但是在选择上有细微区别。

  1. 阻塞队列
  • 供小于求的情况使用阻塞队列更加合适。如果不使用阻塞队列,则会不断轮询,耗费资源。为防止消费进程长时间等待,可以设置超时时间来解决这个问题。
  • 阻塞队列为有界队列,能够设置队列长度
  1. 非阻塞队列
  • 非阻塞队列性能更高
  • 对于实时性不那么高的场景,生产者不断生产,消费者定时消费
  • 非阻塞队列为无界队列

项目中自己写阻塞队列的情况比较少,一般消费MQ的时候会自动阻塞,超过一定时间没有消息会自动断开链接。

非阻塞队列在商品收藏功能上用过。因为商品收藏功能QPS相对高,而且会直接操作DB,导致服务不稳定。收藏业务不需要特别实时,点击收藏按钮后按钮变红,用户查看收藏列表能查看到收藏的商品,很少有人点击收藏后立即查看收藏列表。所以使用Redis的队列存储收藏请求,起定时脚本每分钟定时进行消费。

线程安全的并发队列

队列使用起来方便,但在实际生产中,需要考虑并发情况下,线程安全问题。

对于Java来说,本身提供了线程安全的并发队列:

对于Go来说,有双向链表list,可以实现队列的功能,但该结构并不是线程安全的,如果想并发使用,需要使用sync保证线程安全。

总结

重新看一下基础知识挺有意思的,总能发现很多新的知识点,也能将以前用过的知识归纳总结,还能提供一些新的写作思路。写这篇博客的时候,发现锁可是太有意思了,所以下一篇博客我打算写一下Go语言里的锁,欢迎大家到时候观看。

资料

  1. 阻塞队列与非阻塞队列区别应用场景
  2. 阻塞队列的使用场景?
  3. 简单,高效,实用的非阻塞(无锁)和阻塞并行队列算法
  4. 阻塞队列与非阻塞队列的区别
  5. [怀旧并发06]分析ReentrantLock的实现原理
  6. 什么是可重入
  7. 线程安全的并发队列
  8. CAS无锁算法与ConcurrentLinkedQueue
  9. ReentrantLock 锁详解

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

  1. 设计模式
  2. 招聘
  3. 思考
  4. 存储
  5. 算法系列
  6. 读书笔记
  7. 小工具
  8. 架构
  9. 网络
  10. Go语言
相关文章
|
10天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1223 5
|
9天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1199 87
|
10天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1786 13
|
19天前
|
人工智能 运维 安全
|
3天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
233 127
|
3天前
|
前端开发
Promise的then方法返回的新Promise对象有什么特点?
Promise的then方法返回的新Promise对象有什么特点?
174 2