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.mzph.cn/pingmian/63528.shtml

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

相关文章

开发 UEFI 驱动

服务型驱动的特点&#xff1a; 1&#xff09;在 Image 的入口函数中执行安装&#xff1b; 2&#xff09;服务型驱动不需要驱动特定硬件&#xff0c;可以安装到任意控制器上&#xff1b; 3&#xff09;没有提供卸载函数。 一个设备 / 总线驱动程序在安装时首先要找到对应的硬件…

java时间处理SimpleDateFormat详解

文章目录 常用构造函数日期格式模式常见用法1. 格式化日期2. 解析日期字符串 注意事项示例扩展&#xff1a;指定区域和时区 SimpleDateFormat 是 Java 中用于日期和时间格式化的类&#xff0c;属于 java.text 包。它允许开发者将日期对象格式化为字符串&#xff0c;或者将字符…

夜莺运维指南之故障自愈

注意: 夜莺v7版本已内置故障自愈, 只需要更给n9e下的config.yaml 文件有关ibex配置即可 所谓的告警自愈&#xff0c;典型手段是在告警触发时自动回调某个 webhook 地址&#xff0c;在这个 webhook 里写告警自愈的逻辑&#xff0c;夜莺默认支持这种方式。另外&#xff0c;夜莺还…

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

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

python rstrip 的迷惑行为

在项目中&#xff0c;我需要把字符串末尾的一部分去掉&#xff0c;类似截断&#xff0c;我用ide的随笔提示&#xff0c;发现了rstrip这个方法&#xff0c;然后我试了下&#xff0c;满足我的需求&#xff0c;但在测试过程中&#xff0c;我发现了rstrip的一些行为很让我迷惑。 开…

计算机网络编程(Linux):I/O多路转接之 select,poll

I/O多路复用&#xff08;I/O Multiplexing&#xff09;是一种高效的网络编程技术&#xff0c;允许一个线程同时监控多个文件描述符的状态&#xff0c;当某个文件描述符就绪时进行相应处理。这种技术在高并发服务器中广泛使用。本文将介绍I/O多路复用的核心概念及在Linux中的实现…

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…

Spring Boot助力,一键解锁招聘全流程信息精细化管理

2系统相关技术 2.1 Java语言介绍 Java是由SUN公司推出&#xff0c;该公司于2010年被oracle公司收购。Java本是印度尼西亚的一个叫做爪洼岛的英文名称&#xff0c;也因此得来java是一杯正冒着热气咖啡的标识。Java语言在移动互联网的大背景下具备了显著的优势和广阔的前景&#…

Day28两个数组的交集

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 class Solution{public int[] intersection(int[] nums1, int[] nums2) {Set<Integer> set new HashSet<>();for (int i :…

VRRP的知识点总结及实验

1、VRRP VRRP(Virtual Router Redundancy Protocol&#xff0c;虚拟路由器冗余协议)既能够实现网关的备份&#xff0c;又能解决多个网关之间互相冲突的问题&#xff0c;从而提高网络可靠性。 2、VRRP技术概述&#xff1a; 通过把几台路由设备联合组成一台虚拟的“路由设备”…

DP协议:概括

来了来了&#xff01;&#xff01;&#xff01; 开始之前扯点概念&#xff0c;知道DP好在哪里&#xff0c;以及看到它的发展趋势&#xff0c;才知道我们为什么有学习的必要。 DP的优势 DisplayPort&#xff08;DP&#xff09;协议作为一种专为数字音频和视频传输设计的高速串行…

Ant Design Vue 中 Tree 组件复选框修改样式

一、问题 最近需要实现一个业务需求&#xff0c;要修改勾选框中的颜色&#xff0c;默认勾选框的颜色是蓝色&#xff0c;现在需要变成绿色。 1、官网示例&#xff1a; 2、业务需求&#xff1a; 3、具体实现&#xff1a; HTML 部分代码 <template><div class"s…

【JavaWeb后端学习笔记】登录校验(JWT令牌技术、Interceptor拦截器、Filter过滤器)

登录校验 1、JWT令牌技术1.1 JWT令牌介绍1.2 Java代码生成与校验JWT令牌 2、Filter过滤器2.1 Filter过滤器的简单实现2.2 配置拦截路径2.3 Filter接口中的三个方法&#xff1a;2.4 Filter过滤器登录校验2.5 过滤器链 3、Interceptor拦截器3.1 拦截器(Interceptor)的简单实现3.2…

Linux系统下常用资源查看

一、查看CPU使用率 top 命令 top命令可以看到总体的系统运行状态和cpu的使用率 。 %us&#xff1a;表示用户空间程序的cpu使用率&#xff08;没有通过nice调度&#xff09; %sy&#xff1a;表示系统空间的cpu使用率&#xff0c;主要是内核程序。 %ni&#xff1a;表示用户空间且…

Flutter提示错误:无效的源发行版17

错误描述 Flutter从3.10.1 升级到3.19.4&#xff0c;在3.10.1的时候一切运行正常&#xff0c;但是当我将Flutter版本升级到3.19.4后&#xff0c;出现了下方的错误 FAILURE: Build failed with an exception.* What went wrong: Execution failed for task :device_info_plus:…

java+ssm+mysql学生信息管理系统

项目介绍&#xff1a; 使用javassmmysql开发的学生信息管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、教师、学生角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理&#xff08;可以新增管理员&#xff09;&#xff1b;专业管理&…

PCB设计规范

过孔设计 过孔盖油工艺&#xff08;也成为连塞带印&#xff09;&#xff1a;常规工艺、免费工艺&#xff0c;无特殊情况也建议使用此工艺。过孔大小建议直径在0.3mm-0.5mm之间。最省钱&#xff0c;效果最好。 非金属化槽孔 PCB制造商在加工非金属化槽孔时通常采用锣刀加工。最…

【C语言】42道大厂笔试题目(选择题)

本篇博客给大家带来的是一些大厂笔试题目&#xff0c;题目难度&#xff1a;简单&#xff0c;适合小白快速入手C语言部分的大厂笔试难度。 &#x1f41f;&#x1f41f;文章专栏&#xff1a;C语言 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢…

设置笔记本同时连接内外网

原理&#xff1a;通过笔记本和手机相连&#xff0c;实现双网卡功能能。笔记本连接内网wifi、同时手机端开启usb网络共享&#xff0c;笔记本就有了两个网&#xff0c;然配置那个访问外网&#xff0c;那个访问内网。 1.笔记本wifi连接内网wifi 2.手机端共享网络。 手机打开 -【…

JVM类加载三步解读: 双亲委派模型如何维护Java生态

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! &#x1f649;Java是面向对象编程&#xff0c;一切皆对象。这些对象是如何从一堆代码变成程序中的一部分&#xff1f;Java虚拟机&#xff08;JVM&#xff09;在这个过程中扮演了至关重要的角色。当你的代码通…