ConcurrentLinkedQueue<>实现生产者-消费者问题理解和简易demo

1.ConcurrentLinkedQueue<>

ConcurrentLinkedQueue 是 Java 中的一个线程安全的无界队列实现。它基于无锁(lock-free)的算法,采用了一个高效的、非阻塞的、可伸缩并发控制机制。这使得在高并发场景下能够实现较高的吞吐量。

无界性质:ConcurrentLinkedQueue 是无界的,理论上能够存储无限数量的元素(当然,实际上受限于系统内存)。
非阻塞特性:使用非阻塞算法,提供高效的访问性能,它并不使用锁,因而在多线程并发环境下能够提供高性能。区别于ArrayBlockingqueue
线程安全性:支持多线程同时进行元素的插入和删除操作,即便并发访问也能保持数据的一致性。
主要方法:
offer(E e): 将指定元素插入到队列的尾部。
poll(): 获取并移除队列头部的元素,如果队列为空,则返回 null。
peek(): 仅获取队列头部的元素,不移除,如果队列为空,则返回 null。
isEmpty(): 检测队列是否为空。
由于 ConcurrentLinkedQueue 是无界的,它适合在你不需要对队列的大小进行严格控制的场景下使用。

2.生产者-消费者问题

生产者-消费者问题是一个经典的并发控制问题。在这一问题中,存在一组生产者线程和一组消费者线程,生产者生成数据并写入到一个共享的缓冲区(或队列)中,而消费者从该缓冲区中读取和处理数据。

目的:协调生产者和消费者对共享资源(例如缓冲区)的访问,确保数据产生与消费的有效平衡。

关键挑战:

缓冲区管理:需要确保生产者在缓冲区满时等待,消费者在缓冲区空时等待。
互斥和同步:避免生产和消费操作在同一时刻对共享缓冲区造成冲突。
数据完整性:保证数据在并发修改下完整和有效。
解决方案:

使用锁和条件变量(Condition Variables)来管理对缓冲区的访问。
使用信号量(Semaphores)来控制访问和保证互斥。
更简便的是使用 Java 提供的 BlockingQueue,例如 ArrayBlockingQueue 或 LinkedBlockingQueue,这些类提供了内置的阻塞机制,在缓冲区满时生产者阻塞,在缓冲区为零时消费者阻塞,透明地处理同步问题。
通过有效地实现生产者-消费者模式,可以高效地在多线程环境下处理数据,并减少线程间的竞态条件和同步开销。

3.ConcurrentLinkedQueue实现生产者-消费者模式

public class MyQueue {private static ConcurrentLinkedQueue<Integer> myqueue=new ConcurrentLinkedQueue<>();private static final int MAX_SIZE=10;public static void main(String[] args) {//模拟生产者-消费者问题 concurrentlinkedqueue是非阻塞队列Random random=new Random();new Thread(new Runnable() {@Overridepublic void run() {//生产者线程for(int i=0;i<MAX_SIZE;i++){int item=random.nextInt(100);myqueue.offer(item);System.out.println("生产者线程生产了一个数据:"+item);try {Thread.sleep(200);} catch (InterruptedException e) {throw new RuntimeException(e);}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while(true){//注意要在循环里面去判断是否为空if(!myqueue.isEmpty()){int item= myqueue.poll();//要确保item不为空System.out.println("消费者线程消费了一个数据"+item);}else{System.out.println("队列为空,持续等待数据");}try {Thread.sleep(700);}catch (InterruptedException e){throw new RuntimeException(e);}}}}).start();}
}

整体demo就是开了两个线程对queue进行操作,queue可以认为是数据共享区,一个线程生产数据,一个线程消费数据,可以在队列为空时候进行其他操作,本demo只是个示例,意指在Java中对如何实现生产者-消费者问题有初步理解可以运用于项目中

与一开始demo相比之下 犯过的错误是消费者线程需要持续消费 所以while循环是必要的,以及生产者休眠时间应该同步for循环内。

以及虽然队列本身是线程安全的,但是涉及生产者-消费者模式的时候,需要一些同步机制来确保消费者在队列为空时候等待,或者频繁检查队列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/486906.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代&#xff0c;音频设备的兼容性和性能成为了用户关注的重点。LDR6500&#xff0c;作为乐得瑞科技精心研发的USB Power Delivery&#xff08;PD&#xff09;协议芯片&#xff0c;凭借其卓越的性能和广泛的应用兼容性&#xff0c;为音频设备领域带来了新…

面试技术点之安卓篇

一、基础 二、高级 三、组件 Android中SurfaceView和TextureView有什么区别&#xff1f; 参考 Android中SurfaceView和TextureView有什么区别&#xff1f; 四、三方框架 五、系统源码 六、性能优化

Mock神器:Easy-Mock 私有化部署及使用介绍

在现代前后端分离的开发模式中&#xff0c;后端接口的数据模拟是一个常见且必要的需求。尤其是在后端接口尚未开发完成时&#xff0c;前端开发需要依赖模拟数据进行开发与测试。Easy-Mock 是一个非常流行的开源工具&#xff08;虽然它已经停止更新好长时间了&#xff09;&#…

React v19稳定版发布12.5

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f495; 目…

如何在Ubuntu中利用repo和git地址下载获取imx6ull的BSP

01-设置git的用户名和邮箱 git config --global user.name "suwenhao" git config --global user.email "2487872782qq.com"这里不设置的话后面在第5步的repo配置中还是会要求输入&#xff0c;而且以后进行相关操作都要输入&#xff0c;不妨现在就进行配置…

高德地图3D地图SDK造成ANR问题记录

问题描述&#xff1a; 在新接手的项目中使用到了高德地图的3D的SDK,其依赖导入如下 api com.amap.api:3dmap:latest.integrationapi com.amap.api:search:9.7.0在使用过程中&#xff0c;用到了TileOverlay图层&#xff0c;使用过程中有一下两个问题&#xff1a; 1.在特定的AMAP…

【AI实战项目】基于OpenCV的“颜色识别项目”完整操作过程

OpenCV是一个广受欢迎且极为流行的计算机视觉库&#xff0c;它因其强大的功能、灵活性和开源特性而在开发者和研究者中备受青睐。 学习OpenCV主要就是学习里面的计算机视觉算法。要学习这些算法的原理&#xff0c;知道它们适用于哪些场景&#xff0c;然后通过Python编写代码来…

浅谈网络 | 应用层之云网络隔离GRE/VXLAN

目录 前言GRE 隧道技术VXLANGRE/VXLAN接入云平台 前言 之前提到&#xff0c;为云平台中的租户实现隔离时&#xff0c;常用的策略是基于 VLAN。然而&#xff0c;VLAN 只有 12 位&#xff0c;共支持 4096 个 ID&#xff0c;这在最初设计时看似足够&#xff0c;但随着云计算的快速…

Spark on Yarn安装配置,大数据技能竞赛(容器环境)

Spark on Yarn模式&#xff0c;即把Spark作为一个客户端&#xff0c;将作业提交给Yarn服务&#xff0c;由于在生产环境中&#xff0c;很多时候都要与Hadoop使用同一个集群&#xff0c;因此采用Yarn来管理资源调度&#xff0c;可以有效提高资源利用率。 环境说明&#xff1a; 服…

java+springboot+mysql在线文件管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的在线文件管理系统&#xff0c;系统包含管理员、使用员、监察员角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;使用员管理&#xff1b;监测员管理&#xff1b;留言管理&#xff08;回复&#xff09;&#xff1b…

SD Express 卡漏洞导致笔记本电脑和游戏机遭受内存攻击

Positive Technologies 最近发布的一份报告揭示了一个名为 DaMAgeCard 的新漏洞&#xff0c;攻击者可以利用该漏洞利用 SD Express 内存卡直接访问系统内存。 该漏洞利用了 SD Express 中引入的直接内存访问 (DMA) 功能来加速数据传输速度&#xff0c;但也为对支持该标准的设备…

基于单片机的智能灯光控制系统

摘要 现在的大部分的大学&#xff0c;都是采用了一种“绿色”的教学方式&#xff0c;再加上现在的大学生缺乏环保意识&#xff0c;所以在学校里很多的教室&#xff0c;在白天的时候灯都会打开&#xff0c;这是一种极大的浪费&#xff0c;而且随时都有可能看到&#xff0c;这是…

ros项目dual_arm_pick-place(urdf文件可视化查看)

前言 一直想写一些项目的讲解&#xff0c;今天&#xff08;2024.12.05&#xff09;可以说正式开始了。 dual_arm_pick-place项目&#xff0c;是关于两个机械臂协同传递物品。 正文 这次的话&#xff0c;给大家讲一下里面的urdf文件。 这篇文章主要来看一下项目中的urdf文件…

springSecurity权限控制

权限控制&#xff1a;不同的用户可以使用不同的功能。 我们不能在前端判断用户权限来控制显示哪些按钮&#xff0c;因为这样&#xff0c;有人会获取该功能对应的接口&#xff0c;就不需要通过前端&#xff0c;直接发送请求实现功能了。所以需要在后端进行权限判断。&#xff0…

【C++笔记】map和set的使用

前言 各位读者朋友们大家好&#xff01;上期我们讲完了二叉搜索树这一数据结构&#xff0c;这一期我们来讲STL中的map和set这两大容器。这两个容器的底层是红黑树&#xff0c;红黑树的底层是平衡二叉搜索树。 目录 前言一. 序列式容器和关联式容器二. set系列的使用2.1 set类…

IO进程学习笔记

man手册 普通命令。系统调用的函数。库函数。特殊文件。文件格式。游戏。附加的一些变量 IO介绍 I&#xff1a;input 输入 O&#xff1a;output 输出 对文件的输入和输出 输入-》写文件&#xff0c;将文件中的内容写到内存中去 输出-》读文件&#xff0c;将内存中的内容读取到文…

基于STM32的手势电视机遥控器设计

目录 引言系统设计 硬件设计软件设计系统功能模块 手势识别模块遥控信号发送模块控制接口模块控制算法 手势识别算法遥控信号映射算法代码实现 手势识别与处理遥控信号发送系统调试与优化结论与展望 1. 引言 随着智能家居和物联网技术的发展&#xff0c;传统的电视遥控器逐渐…

哈希表实现

哈希概念 哈希&#xff08;hash&#xff09;又称散列&#xff0c;是一种组织数据的方式。从译名来看&#xff0c;有散乱排列的意思。本质就是通过哈希函数把关键字 Key 跟存储位置建立一个映射关系&#xff0c;查找时通过这个哈希函数计算出 Key 存储的位置&#xff0c;进行快…

CSS学习记录08

CSS文本颜色 文本颜色 color属性用于设置文本的颜色&#xff0c;颜色由以下值指定&#xff1a; 颜色名-比如“red"十六进制值-比如”#ff0000"RGB值-比如&#xff1a;“rgb&#xff08;255,0,0)”等。 页面的默认文本颜色在body选择器中定义的。 body {color: bl…

电子商务人工智能指南 6/6 - 人工智能生成的产品图像

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…