并发编程:并发集合:非阻塞线程安全的双端队列ConcurrentLinkedDeque

【Java多线程】JUC之并发容器—深入剖析并发队列ConcurrentLinkedDeque(十) **ConcurrentLinkedDeque**: 基于`双向链表`实现的`无界非阻塞线程安全队列`,可以从队列的头和尾同时操作(插入/删除),底层基于`自旋+CAS`的方式实现,**适合“`多生产,多消费`”的场景。** - 双端队列与普通队列的入队区别是:双端队列中元素可以在`“队首、队尾进行入队、出队”` - “**队首入队**”底层调用了`linkFirst()`方法,而“**队尾入队**”是调用了` linkLast()`方法 - “**队首出队**”底层调用了`unlinkFirst( 阅读详情

目录

ConcurrentLinkedDeque

一、主程序

二、向队列添加元素的任务类

三、消费队列元素的任务类

四、执行结果


ConcurrentLinkedDeque

  • add:向队列尾部添加元素
  • pollFirst/pollLast:获取并删除队首/队尾元素
  • getFirst/getLast:获取(不删除)队首/队尾元素,如果无元素,则抛出异常NoSuchElementException
  • peekFirst/peekLast:获取(不删除)队首/队尾元素,如果无元素,则返回Null
  • remove/removeFirst/removeLast:删除队首/队首/队尾元素,如果无元素,则抛出异常NoSuchElementException

一、主程序

package xyz.jangle.thread.test.n7_2.concurrentlinkeddeque;

import java.util.concurrent.ConcurrentLinkedDeque;

/**
 * 7.2、非阻塞线程安全的双端队列
 * 
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月10日 下午7:21:39
 * 
 */
public class M {

	public static void main(String[] args) {
		var list = new ConcurrentLinkedDeque<String>();
		var threads = new Thread[100];
		for (int i = 0; i < threads.length; i++) {
			var task = new AddTask(list);
			threads[i] = new Thread(task);
			threads[i].start();
		}
		System.out.println("M:" + threads.length + "个线程往队列中添加元素");
		for (int i = 0; i < threads.length; i++) {
			try {
				threads[i].join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		// 100 * 10000 个元素
		System.out.println("元素添加完毕,队列长度:" + list.size());
		System.out.println("开始创建消费线程");
		for (int i = 0; i < threads.length; i++) {
			var task = new PollTask(list);
			threads[i] = new Thread(task);
			threads[i].start();
		}
		System.out.println("M:" + threads.length + "个消费线程向队列获取元素");
		for (int i = 0; i < threads.length; i++) {
			try {
				threads[i].join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		// 消费 100 * 2 * 5000 剩余0个元素
		System.out.println("M:消费完后,队列长度:" + list.size());

	}

}

二、向队列添加元素的任务类

package xyz.jangle.thread.test.n7_2.concurrentlinkeddeque;

import java.util.concurrent.ConcurrentLinkedDeque;

/**
 *  添加元素的任务
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月10日 下午7:22:43
 * 
 */
public class AddTask implements Runnable {

	private final ConcurrentLinkedDeque<String> list;

	public AddTask(ConcurrentLinkedDeque<String> list) {
		super();
		this.list = list;
	}

	@Override
	public void run() {
		String name = Thread.currentThread().getName();
		for (int i = 0; i < 10000; i++) {
			list.add(name +":Element "+i);
		}
	}

}

三、消费队列元素的任务类

package xyz.jangle.thread.test.n7_2.concurrentlinkeddeque;

import java.util.concurrent.ConcurrentLinkedDeque;

/**
 * 消费队列元素的任务类
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月10日 下午7:24:53
 * 
 */
public class PollTask implements Runnable {

	private final ConcurrentLinkedDeque<String> list;

	public PollTask(ConcurrentLinkedDeque<String> list) {
		super();
		this.list = list;
	}

	@Override
	public void run() {
		for (int i = 0; i < 5000; i++) {
			list.pollFirst();
			list.pollLast();
		}
	}

}

四、执行结果

M:100个线程往队列中添加元素
元素添加完毕,队列长度:1000000
开始创建消费线程
M:100个消费线程向队列获取元素
M:消费完后,队列长度:0

企业碳排放计算方法与实践:从年度总量到月度分配的完整流程 本文系统介绍了企业碳排放计算的全流程方法,包括数据预处理、能源活动与产品生产碳排放计算、年度汇总及月度分配优化。通过ARIMA模型预测补充缺失数据,采用二次规划算法实现基于用电量模式的月度碳排放分配,确保计算结果的准确性与合理性。该方法为企业碳排放管理提供了科学工具,有助于精准监控排放、制定减排策略并满足合规要求。实施中需注重数据质量控制和排放因子选择,并根据企业特点调整参数。该流程适用于制造业企业,为实现碳中和目标提供可靠的数据基础和管理支持。 阅读详情

相关推荐

String+CytoScape构建PPI网络

1.下载CytoScape Cytoscape是一款专业强大好用的物生信息分析软件,主要达用于专业的研究人员使用,软件主要适用于整合模块化网络和生物科学联系网络图的绘制,支持多种文件格式,导入后就可以直接进行编辑或者分析等操作了,除此之外,软件还提供了强大的编辑工具,支持添加相应的注释信息,软件基于java环境组件打造。 下载地址:https://cytoscape.org/ 因为软件基于java...

xiaobai1_1的博客 1万+

JDK源码——线程安全的双端队列

和都是 Java 集合框架中的双端队列实现。它们都允许在两端插入和移除元素,并且是线程安全的。

庄的博客 944

SQLSTATE58030

在优化一条SQL的时候遇到了执行错误 gtlions =# select t1.telnumber,t2.ua,t2.url,t1.apply_name,t2.apply_name from tb1 t1 gtlions -# left outer join tb2 t2 on t1.sid = t2.ipsid gtlions-# where t1.sum_date=20141128 a

Gtlions Tracker 3658

java 双端队列 线程安全的

给大家整理了一些有关【Java,线程】的项目学习资料(附讲解~~):https://edu.51cto.com/course/35714.htmlhttps://edu.51cto.com/course/31877.htmlJava双端队列线程安全实现指南 作为一名经验丰富的开发者,我很高兴能帮助你实现Java中的双端...

weixin_36938222的博客 152

Quartus II 13.0安装避坑指南:从下载到破解的完整流程(附常见错误解决方案)

本文提供Quartus II 13.0软件的详细安装与破解指南,涵盖从下载准备、路径设置、主程序安装到授权配置的全流程。重点解析了破解过程中生成和修改license.dat文件的核心步骤,并针对“无法找到有效的License文件”等常见错误提供了实用的解决方案,帮助用户快速构建稳定的FPGA开发环境。

weixin_29291863的博客 757

6.4 实战项目:基于Agent内核构建Code Review智能体

本文介绍了一个基于Agent内核构建的智能Code Review系统实战项目。系统采用多Agent协作架构,包含代码质量分析、安全漏洞识别、性能优化建议等核心功能模块。文章详细展示了系统架构设计,采用协调器Agent管理多个专业Agent协同工作,并提供了基础Agent框架和协调器Agent的TypeScript实现代码。项目结合了AI Agent核心原理和多Agent协作机制,实现了自动化的代码审查流程,能够生成详细的审查报告,帮助开发者提升代码质量和安全性。

yonggeit的博客 3103

使用非阻塞线程安全双端队列

Java 9并发编程指南 目录 使用非阻塞线程安全双端队列准备工作实现过程工作原理扩展学习 List被称为最基本的集合,具有不确定数量的元素,可以在任何位置增加、读取,或者删除元素。并发列表允许不同线程在同一时间添加或删除来自列表中的元素,而不会产生任何数据非一致性错误。与列表相似的,还有双端队列,其数据结构与队列相近,但在双端队列中,可以在前(头)后(尾)端添加或删除。 本节将学习在并发应用中如...

西木空间 575

【异常】OpenClaw 项目 `fetch failed` 报错问题排查与解决方案Response interrupted: TypeError: fetch failed

针对无超时控制、异常兜底缺失导致的请求中断,封装标准化的安全请求工具,一次性解决超时控制、异常捕获、日志埋点三大问题,全项目替换原生。:将项目运行的 Node.js 版本升级至 18.x 及以上 LTS 版本,使用 Node.js 内置的稳定版。实现的网络请求环节,包括但不限于:第三方开放接口调用、内部服务接口通信、跨域资源请求、外部配置拉取等场景。:针对无法升级 Node.js 版本的存量环境,通过社区稳定兼容包替换原生。类型异常,直接造成业务请求响应中断。第二步:业务代码改造,替换原生。

奶爸的编程之路,也就一周冷个三天 366

使用阻塞线程安全双端队列

Java 9并发编程指南 目录 使用阻塞线程安全双端队列准备工作实现过程工作原理扩展学习更多关注 List作为最基本的集合,包含没有限制数量的元素,可以在任何位置增加、读取,或者删除元素。并发列表允许不同线程在同一时间添加或删除来自列表中的元素,而不会产生任何数据非一致性错误。与列表相似的,还有双端队列,其数据结构与队列相近,但在双端队列中,可以在前(头)后(尾)端添加或删除。 本节将学习在并发应...

西木空间 356

基于Matlab使用雷达资源管理有效跟踪多个机动目标仿真(附源码)

多功能雷达可以搜索目标,确认新轨道,并重新访问轨道以更新状态。为了执行这些功能,多功能雷达通常由资源管理器管理,该资源管理器创建用于搜索、确认和跟踪的雷达任务。这些任务是根据优先级和时间安排的,因此,在每个时间步长中,多功能雷达都可以将其波束指向所需的方向。在此示例中,对于用于跟踪机动目标的雷达,有两个相互冲突的要求:目标的数量及其初始位置通常事先不知道。因此,雷达必须不断搜索感兴趣的区域才能找到目标。此外,雷达需要在进入雷达覆盖区域后立即检测并建立对每个目标的跟踪。目标机动的时间段事先是未知的。

珞瑜的博客 3145

YOLO11改进-注意力-引入Deformable Large Kernel Attention (DLKA) 解决多尺度、小目标、遮挡等问题

Deformable Large Kernel Attention (DLKA) 是一种用于视觉任务的注意力机制,旨在提升模型在处理不同尺寸和形状对象时的灵活性和性能。DLKA 的设计灵感源自传统的注意力机制,但通过引入可变形核(deformable kernel)来增强对局部特征的适应能力。

qq_64693987的博客 4041

Java多线程总结之线程安全队列Queue

  在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是 ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 注:什么叫线程安全?这个首先要明确。线程安全的类,指的是类内共享的全...

weixin_34342578的博客 1790

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentLinkedDeque

ConcurrentLinkedDeque 是 Java 并发工具包(java.util.concurrent 包)中的一个线程安全的双端队列(Deque)实现,实现了 Deque 接口。它使用了链表结构,并且针对高并发环境进行了优化,非常适合用于多线程环境中需要安全地并发访问双端队列的情况。ConcurrentLinkedDeque 不使用锁来保证线程安全,而是通过 CAS(Compare and Swap)原子操作来实现线程安全。

热带鱼的技术博客 2121

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

java多线程并发之旅-18-双端队列之 ConcurrentLinkedDeque

问题 ConcurrentLinkedDeque 是什么? 优缺点? 应用场景? 源码实现? 个人启发? 引言 在并发编程中我们有时候需要使用线程安全的队列。 如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。 使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以...

1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java基础 集合框架 队列架构 双端队列 Deque

Java基础 Map集合框架 队列架构 双端队列 Deque

骑牛小道士 932

Java进阶之线程安全ConcurrentLinkedDeque:用法实例(一百七十四)

本篇目的:Java线程安全ConcurrentLinkedDeque:用法实例基本概念ConcurrentLinkedDeque是Java并发包提供的无界非阻塞双端链表队列,支持头尾并发插入与移除,采用CAS实现高并发。功能提供addFirst、addLast、pollFirst、pollLast、peekFirst、peekLast等方法,支持FIFO与LIFO。使用限制不接受null元素;遍历时数据可能变化;容量无界。性能特性无锁算法,两端并行操作无竞争,吞吐量随线程数线性扩展。使用场景。

Android系统攻城狮 888

Java并发编程_并发集合

Java并发集合框架 非阻塞式集合:这类集合包括添加和移除的方法,如果方法不能立即被执行,则返回null或抛出异常,但是调用这个方法的线程不会被阻塞。 阻塞式集合:这类集合也包括添加和移除的数据方法。当集合已满或为空时,被调用的添加或者移除方法就不能立即被执行,那么调用这个方法的线程将被阻塞,一直到该方法可以被成功执行。 1. 非阻塞集合 1.1 ConcurrentLinkedQueue 一个...

AN_ERA的博客 315

Java7并发编程--5、并发集合

Java提供了两类适用于并发场景下的集合: 阻塞式集合(Blocking Collection):这类集合包括添加和移除数据的方法,当集合已满或为空时,被调用的添加或者移除方法就不能立即被执行,那么调用这个方法的线程将被阻塞,一直到该方法可以被成功执行。非阻塞式集合(Non-Blocking Collection):这类集合也包括添加和移除数据的方法,只是如果方法不能立即被执行,则返回n

HelloWorld 1117

Java线程安全队列与双端队列全解析:从阻塞到非阻塞的选型指南

在并发编程中,队列是生产者-消费者模式的核心组件。Java通过java.util.concurrent包提供了线程安全的Queue和Deque实现,其底层依赖锁、条件变量或CAS无锁算法来保证多线程环境下的数据一致性。理解阻塞与非阻塞、有界与无界的区别,能帮助开发者避免OOM和性能瓶颈,在任务调度、消息缓冲等场景中做出正确选型。本文系统梳理了ArrayBlockingQueue、LinkedBlockingQueue、ConcurrentLinkedQueue等核心类的设计原理与适用边界,并结合实战经验给出

weixin_33507732的博客 146

ConcurrentLinkedDeque和ConcurrentLinkedQueue

看关键字Concurrent就知道这个两个类是并发类。 ConcurrentLinkedQueue 是单向链表结构的无界并发队列。元素操作按照 FIFO (first-in-first-out 先入先出) 的顺序。适合“单生产,多消费”的场景。内存一致性遵循对ConcurrentLinkedQueue的插入操作先行发生于(happen-before)访问或移除操作。 ConcurrentLin...

that summer 5217

java队列使用

java队列

壹拾贰 4515

Java之集合(二十四)ConcurrentLinkedDeque

  转载请注明源出处:http://www.cnblogs.com/lighten/p/7517454.html 1.前言   本章介绍并发队列ConcurrentLinkedDeque,这是一个非阻塞,无锁,无界 ,线程安全双端操作的队列。简单说就是ConcurrentLinkedQueue的升级版,在JDK7之后才提供。该队列也不允许空元素,而且size方法并不是常量时间,其需要...

decvo6179的博客 392

并发集合类

并发集合类 1.集合类 (1) List LinkedList:是双向链表实现的双端队列;它不是线程安全的,只适用于单线程。 ArrayList:是数组实现的队列,它是一个动态数组;它也不是线程安全的,只适用于单线程。 Vector:是数组实现的矢量队列,它也一个动态数组;不过和ArrayList不同的是,Vector是线程安全的,它支持并发。 Stack:是Vector实现的栈;和Vector一样,它也是线程安全的。 (2)Set HashSet:是一个没有重复元素的集合,它通过HashMap实现的

梦醉的博客 1321

LinkedList数据结构深挖(六)之ConcurrentLinkedDeque基本使用

是Java提供的一个线程安全的双端队列(Deque)实现。它基于链表结构,支持高效的并发操作,适用于多线程环境下的数据共享。与类似,也是非阻塞的,但其支持从队列的两端进行插入和删除操作。是Java并发编程中一个非常实用的数据结构,特别适合需要高效并发操作的双端队列场景。通过本文的介绍,希望读者能够掌握其基本使用方法和适用场景,从而在实际开发中灵活运用。扩展阅读Java并发编程实战Java官方文档 - ConcurrentLinkedDeque。

qq_61302385的博客 585

Java同步数据结构之ConcurrentLinkedDeque

前言 由于LinkedBlockingDeque作为双端队列的实现,采用了单锁的保守策略使其不利于多线程并发情况下的使用,故ConcurrentLinkedDeque应运而生,它是一种基于链表的无界的同时支持FIFO、LIFO的非阻塞并发双端队列,当许多线程共享对公共集合的访问时,ConcurrentLinkedDeque是一个合适的选择,类比ConcurrentLinkedQueue是针对Li...

weixin_30381317的博客 469

并发集合

并发集合 普通的List Set Map集合在并发环境下 遍历的过程中不容许更新操作(增删改) ConcurrentCollection(并发集合) 非阻塞式集合(Non-Blocking Collection)------>ConcurrentLinkedDeque 阻塞式集合(Blocking Collection)---------> LinkedBlockingDeque 非阻...

qq_22228101的博客 263
上一篇: 并发编程:并行反应式流:编程流(Flow.Subscriber)
下一篇: 并发编程:并发集合:阻塞线程安全的双端队列LinkedBlockingDeque
博风
博客等级 码龄16年 442粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值