Java 中 一些常见的并发集合类

什么是并发集合?列举一些常见的并发集合类

并发集合是一种特殊的数据结构,它允许多个线程安全地访问和修改。在多线程编程的场景下,只有使用并发集合才能确保线程安全,避免多个线程在对同一个数据结构进行并发操作时引发的竞态条件和其他并发错误。

常见的并发集合类包括:

  1. ArrayBlockingQueue:一个基于数组实现的阻塞队列,创建对象时必须指定容量。
  2. ConcurrentLinkedQueue:一个线程安全的、基于链接节点的、可选容量的无界非阻塞队列。
  3. LinkedBlockingQueue:一个基于链表的阻塞队列,此队列按 FIFO(先进先出)排序元素。
  4. PriorityBlockingQueue:一个支持优先级堆的无界阻塞队列。
  5. DelayQueue:一个支持延时获取元素的无界阻塞队列。
  6. SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等待一个相应的删除操作,反之亦然。
  7. LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
  8. CopyOnWriteArrayList:一个线程安全的可变数组,其中所有可变操作(add、set 等等)都是通过对底层数组的复制来实现的。
  9. CopyOnWriteArraySet:一个线程安全的 Set 实现,基于 CopyOnWriteArrayList。

这些并发集合类提供了线程安全的集合操作,使得在多线程环境下可以安全地共享和修改数据。

并发集合的使用示例

以下是一个使用 ConcurrentLinkedDeque 的简单示例,该示例展示了如何在多线程环境下安全地添加和删除元素:

import java.util.concurrent.ConcurrentLinkedDeque;public class ConcurrentCollectionExample {public static void main(String[] args) throws InterruptedException {// 创建一个并发双端队列ConcurrentLinkedDeque<String> deque = new ConcurrentLinkedDeque<>();// 增加任务类,用于向队列中添加数据class AddTask implements Runnable {private ConcurrentLinkedDeque<String> deque;public AddTask(ConcurrentLinkedDeque<String> deque) {this.deque = deque;}@Overridepublic void run() {String name = Thread.currentThread().getName();for (int i = 0; i < 1000; i++) {deque.add(name + ":" + i);}}}// 删除任务类,用于从队列中删除数据class PollTask implements Runnable {private ConcurrentLinkedDeque<String> deque;public PollTask(ConcurrentLinkedDeque<String> deque) {this.deque = deque;}@Overridepublic void run() {String name = Thread.currentThread().getName();while (!deque.isEmpty()) {System.out.println(name + " removed: " + deque.poll());}}}// 创建并启动添加数据的线程Thread addThread1 = new Thread(new AddTask(deque), "AddThread1");Thread addThread2 = new Thread(new AddTask(deque), "AddThread2");addThread1.start();addThread2.start();// 等待添加数据的线程完成addThread1.join();addThread2.join();// 创建并启动删除数据的线程Thread pollThread = new Thread(new PollTask(deque), "PollThread");pollThread.start();// 等待删除数据的线程完成pollThread.join();System.out.println("Deque is now empty.");}
}

在这个示例中,我们创建了一个 ConcurrentLinkedDeque,它是一个线程安全的双端队列。我们定义了两个任务类,AddTaskPollTask,分别用于向队列中添加数据和从队列中删除数据。这两个任务类都实现了 Runnable 接口,因此它们可以被线程执行。

main 方法中,我们创建了两个添加数据的线程和一个删除数据的线程。这两个添加数据的线程将向队列中添加数据,而删除数据的线程将从队列中删除数据,直到队列为空。

通过使用 ConcurrentLinkedDeque,我们可以在多线程环境下安全地进行添加和删除操作,而不需要额外的同步或锁定。这是并发集合的主要优势之一。

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

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

相关文章

UI设计常见风格(1):一文读懂九个,教你如何辨识。

Hello&#xff0c;我是大千UI工场&#xff0c;设计风格是我们新开辟的栏目&#xff0c;上次讲了毛玻璃风格、辨识方法、应用场景、运用方法等&#xff0c;很受大家欢迎&#xff0c;本次带来常见的风格及辨识&#xff0c;让大家有个总览&#xff0c;以后会逐个讲解的&#xff0c…

【Java】零基础蓝桥杯算法学习——动态规划例题

例题&#xff1a;2023年第十四届蓝桥杯Java软件开发B组E题 蜗牛 参考解答&#xff1a; 参考代码示例&#xff1a; import java.util.Scanner; public class Main {static int N 100010;static int[] arr new int[N];static int[] a new int[N]; //传送带的起始坐标static …

人工智能之数学基础【最小二乘法】

原理 最小二乘法由勒让德(A.M.Legendre)于1805年在其著作《计算彗星轨道的新方法》中提出,主要思想是最小化误差二次方和寻找数据的最佳匹配函数,利用最小二乘法求解未知参数,使得理论值与观测值之差(即误差,或称为残差)的二次方和达到最小,即: E = ∑ i = 1 n ϵ …

【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

开什么店最稳定轻松?适合一个人开的实体店推荐

在创业的道路上&#xff0c;很多人都希望找到一种稳定轻松的开店方式。 作为一名资深的鲜奶吧创业者&#xff0c;我将分享我的经验和见解&#xff0c;希望能给那些想开实体店的朋友们一些启示&#xff01;&#xff01; 我开鲜奶吧已经有 5 年时间了&#xff0c;目前经营的是鲜…

MySQL查询状态

MySQL查询状态 在一个查询周期中&#xff0c;MySQL任何时刻都有一个状态&#xff0c;该状态可能会变化很多次&#xff0c;可以使用show full processlist来进行查看 Sleep 线程正在等待客户端发送新的请求 Query 线程正在执行查询或者正在将结果发送给客户端 Locked 该线程正在…

MIT-BEVFusion系列八--onnx导出1 综述及相机网络导出

目录 综述export-camera.py加载模型加载数据生成需要导出成 onnx 的模块Backbone 模块VTransform 模块 生成 onnx使用 pytorch 原生的伪量化计算方法导出 camera.backbone.onnx导出 camera.vtransform.onnx 综述 bevfusion的各个部分的实现有着鲜明的特点&#xff0c;并且相互…

Harris关键点检测以及SAC-IA粗配准

一、Harris关键点检测 C #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/common/io.h> #include <pcl/keypoints/harris_3d.h> #include <pcl/visualization/pcl_visualizer.h> #include …

摸索设计模式的魅力:从策略模式看软件设计的智慧-灵活应对变化的艺术

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、案例场景1.1 一坨坨代码实现1.2 存在的问题 二、使用策略模式解决问题2.1 使用策略模式重构代码2.2 克服了问题 三、模式讲解3.1 结构图及说明3.2 实现步骤和注意事项3.3 适用场景 四、优势和局限性4.1 优势4.2 局…

JSP原理简述

JSP动态网页技术&#xff0c;可以定义html&#xff0c;css&#xff0c;js等静态内容&#xff0c;还可以定义java代码等动态内容。 注意导入坐标时&#xff0c;JSP的scope标签是provided&#xff0c;和servlet一样&#xff0c;否则会报错。 JSP本质上就是一个Servlet&#xff0c…

TestNG invocationCount属性

有时我们会遇到这样的问题&#xff0c;比如如何多次运行一个测试用例&#xff1f;invocationCount是这个问题的答案。在这篇文章中&#xff0c;我们将讨论在TestNG中与Test annotation一起使用的invocationCount属性。 这个属性有什么作用&#xff0c;或者调用计数有什么用&am…

微信小程序的疑惑总结

未解决&#xff1a; 1.storebindings 这里的storebindings是什么 2.空行怎么写&#xff1f; 我用这个<text>\n</text>写&#xff0c;在模拟器上好使&#xff0c;在真机上显示\n 解决方法&#xff1a;在组件里写class类名&#xff0c;wxss里面改高度 已解决&am…

GAN生成对抗性网络

一、GAN原理 出发点&#xff1a;机器学习中生成模型的问题 无监督学习是机器学习和未来人工智能的突破点&#xff0c;生成模型是无监督学习的关键部分 特点&#xff1a; 不需要MCMC或者变分贝叶斯等复杂的手段&#xff0c;只需要在G和D中对应的多层感知机中运行反向传播或者…

洛谷p5662 纪念品

完全背包变形 题目链接 思路 每天手里的钱作为背包容量&#xff0c;商品今天的价格作为体积&#xff0c;明天的价格作为价值&#xff0c;设 d p [ i ] dp[i] dp[i]为花费达到 i i i元时最大的净利润 ACcode #include<bits/stdc.h>using namespace std;const int M 2…

通过 Prometheus 编写 TiDB 巡检脚本(脚本已开源,内附链接)

作者丨 caiyfc 来自神州数码钛合金战队 神州数码钛合金战队是一支致力于为企业提供分布式数据库 TiDB 整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景&#xff0c;全部拥有 TiDB 高级资格证书&#xff0c;并活跃于 TiDB 开源社区&#xff0c;是官方认证合作伙…

NetMizer 日志管理系统 多处前台RCE漏洞复现

0x01 产品简介 NetMizer是提供集成应用交付和应用安全解决方案以实现业务智能网络的优秀全球供应商,为全球企业和运营商提供确保关键业务应用的全面可用性、高性能和完善的安全性的解决方案。 0x02 漏洞概述 NetMizer 日志管理系统position.php、hostdelay.php、等接口处存在…

Android---Jetpack Compose学习006

1. 点击 clickable 修饰符允许应用检测对已应用该修饰符的元素的点击。 示例&#xff1a;点击控件&#xff0c;使得内容发生改变 class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setCo…

比较不相交5点结构的顺序

( A, B )---6*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有6个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构有5个点&#xff0c;收敛误差7e-4&#xff0c;收敛199次&#xff0c;统计迭代次数平均值并排序。 如果行和列可以自由的变换&#xff0c;5个…

Java中的Stack的基本讲解

目录 一、创建栈 二、Stack的一些常用方法 对于栈的基本概念,我就不细说了&#xff0c;后进先出。比如1,2,3,依次进栈&#xff0c;那么出栈就是3&#xff0c;2&#xff0c;1。 一、创建栈 Stack<引用数据类型&#xff0c;基本数据类使用包装类> snew Stack<>();St…

杂谈--spconv导出中onnx的扩展阅读

Onnx 使用 Onnx 介绍 Onnx (Open Neural Network Exchange) 的本质是一种 Protobuf 格式文件&#xff0c;通常看到的 .onnx 文件其实就是通过 Protobuf 序列化储存的文件。onnx-ml.proto 通过 protoc (Protobuf 提供的编译程序) 编译得到 onnx-ml.pb.h 和 onnx-ml.pb.cc 或 on…