ConcurrentHashMap 中的并行性

news2024/11/30 7:49:59

ConcurrentHashMap 在多线程应用程序中被广泛使用。多线程应用程序的示例包括在线游戏应用程序、聊天应用程序,它为应用程序增加了并发性的好处。为了使应用程序本质上更具并发性,ConcurrentHashMap 引入了一个名为“并行性”的概念。

在本文中,我们将了解有关 ConcurrentHashMap 中的并行性的更多信息。

什么是并行性?

基本上,并行计算将问题分解为子问题,然后并行解决这些子问题,最后将子问题的结果合并起来。此时子问题将在单独的线程中运行。

Java 对 ConcurrentHashMap 中的并行性支持

为了利用 ConcurrentHashMap 中的并行性,我们需要使用 Java 1.8 及以上版本。低于 1.8 的 Java 版本不支持并行性。

并行处理的通用框架

Java 引入了一个名为“fork and join”的框架来实现并行计算。它利用java.util.concurrent.ForkJoinPool API 来实现并行计算。此 API 用于在 ConcurrentHashMap 中实现并行性。

ConcurrentHashMap 中的并行方法

ConcurrentHashMap 借助并行度阈值有效地利用了并行计算。它是一个数值,默认值为 2。

以下是 ConcurrentHashMap 中具有并行功能的方法。

  • forEach()
  • 减少()
  • 减少条目()
  • forEachEntry()
  • forEachKey()
  • forEachValue()

ConcurrentHashMap 以稍微不同的方式处理并行性,如果您查看上述方法的方法参数,您就会明白这一点。这些方法中的每一个都可以将并行性阈值作为参数。

首先,并行度是一个可选功能,我们可以通过在代码中添加适当的并行阈值来启用该功能。

不具备并行性的 ConcurrentHashMap 的使用

让我们举一个替换 ConcurrentHashMap 的所有字符串值的例子。这是在没有使用并行性的情况下完成的。

例如:
ConcurrentHashMap.forEach **((k,v) -> v=””); **

这很简单,我们迭代 ConcurrentHashMap 中的所有条目,并用空字符串替换值。在这种情况下,我们不使用并行性

并行使用 ConcurrentHashMap

例如:
ConcurrentHashMap.forEach (2, (k,v) -> v=””);

上面的例子迭代了一个ConcurrentHashMap,并用空字符串替换了map的值。forEach()方法的参数是并行度阈值和一个功能接口。在这种情况下,问题将被分成子问题。

这里的问题是用空字符串替换 ConcurrentHashMap 的值。这是通过将这个问题分成子问题来实现的,即为子问题创建单独的线程,每个线程将专注于用空字符串替换该值。

当启用并行性时会发生什么

当启用并行度阈值时,JVM 将创建线程,每个线程都会运行以解决问题并将所有线程的结果合并在一起。此值的意义在于,如果记录数已达到某个级别(阈值),则只有 JVM 才会启用并行处理。在上面的示例中。如果 Map 中有超过 1 条记录,则应用程序将启用并行处理。

这是一个很酷的功能,我们可以通过调整并行度阈值来控制并行度。这样我们就可以利用应用程序中的并行处理。

看一下下面的另一个例子:

ConcurrentHashMap.forEach (10000,(k,v) -> v=””);

在这种情况下,并行度阈值为 10000,这意味着如果记录数少于 10000,那么 JVM 在用空字符串替换值时将不会启用并行度。

无并行性的完整代码示例
图:没有并行性的完整代码示例

具有并行性的完整代码示例
图:具有并行性的完整代码示例

在上面的例子中,并行度阈值是10000。

并行处理性能比较

以下代码只是用空字符串替换映射中的所有值。此 ConcurrentHashMap 包含超过 100000 个条目。让我们比较以下代码在没有并行和有并行的情况下的性能。

具有和不具有并行性的代码比较
图:有并行性和无并行性的代码比较

运行上述代码后,可以看到在正常的forEach操作的情况下性能略有提升。

非并行时间->20 毫秒
并行时间->30 毫秒

这是因为地图中的记录数量相当少。

但是,如果我们在映射中添加1000 万条记录,那么并行性确实会获胜!处理数据所需的时间更少。看看下图中的代码:

具有和不具有并行性的代码阈值
图:有和没有并行性的代码阈值

上述代码不使用并行性,而是将 ConcurrentHashMap 中的所有值替换为空字符串。接下来,它使用并行性将 ConcurrentHashMap 中的所有值替换为字符串 1。输出如下:

无并行性的时间->537 毫秒
有并行性的时间->231 毫秒

可以看到,在并行的情况下,只需要一半的时间。

注意: 以上值不是恒定的。在不同的系统中可能会产生不同的结果。

并行性的线程转储分析

当我们在代码中启用并行性时,JVM 使用 ForkJoinPool 框架来启用并行处理。该框架根据当前处理中的需求创建一些工作线程。让我们使用 fastthread.io 工具对上述代码进行启用并行性的线程转储分析。

线程数与并行度
图:fastThread 报告显示启用并行后的线程数

在这里插入图片描述

图:fastThread 报告通过启用并行性显示相同的堆栈跟踪

在这种情况下,上述代码总共使用了 42 个线程。其中有 2 个处于等待状态,39 个正在运行,1 个处于定时等待状态。我们可以使用该工具分析更多行为。有关详细分析,您可以使用 fastthread.io 工具进行检查。

从上图你可以了解到它正在使用更多的线程。

运行线程过多的原因是它使用了 ForkJoinPool API。这是负责在后台实现“并行性”的 API。当您查看下一节时,您将了解这种差异。您可以在此处找到报告。

无并行性的线程转储分析

让我们了解在不启用并行的情况下的线程转储分析。
在这里插入图片描述

图:fastThread 报告显示未启用并行性的线程数

在这里插入图片描述

图:fastThread 报告显示未启用并行性的相同堆栈跟踪

如果仔细观察上图,你就会发现只使用了几个线程。与上图相比,本例中只有 35 个线程。本例中有 32 个可运行线程。但是,等待线程和 timed_waiting 线程分别为 2 个和 1 个。本例中可运行线程数量减少的原因是它没有调用 ForkJoinPool API。查看此报告了解更多详细信息。

这样,fastthread.io工具就可以以非常智能的方式深入了解线程转储内部情况。

总结

我们重点介绍了 ConcurrentHashMap 中的并行性以及如何在应用程序中使用此功能。此外,我们还了解了启用此功能时 JVM 会发生什么情况。并行性是一项很酷的功能,可以在现代并发应用程序中很好地使用。

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

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

相关文章

飞机导航数据库资料

以上是从网上收集的飞机导航数据库的一些资料。现在放在百度网盘中。 链接:https://pan.baidu.com/s/1fDYuaB0DuyKmYt6C_lXvZQ?pwdkcqj 提取码:kcqj

ZTE RRC重建优化案例

ZTE RRC重建优化案例 随着移动通信网络的不断发展,用户对网络的稳定性和覆盖质量提出了更高的要求。尤其在LTE网络中,RRC(Radio Resource Control)连接的稳定性直接影响用户体验和业务连续性。然而,在实际网络环境中&a…

案例-表白墙简单实现

文章目录 效果展示初始画面提交内容后画面&#xff08;按键按下&#xff09; 代码区 效果展示 初始画面 提交内容后画面&#xff08;按键按下&#xff09; 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

C++输⼊输出

1.<iostream> 是 Input Output Stream 的缩写&#xff0c;是标准的输⼊、输出流库&#xff0c;定义了标准的输⼊、输 出对象 2.std::cin 是 istream 类的对象&#xff0c;它主要⾯向窄字符&#xff08;narrow characters (of type char)&#xff09;的标准输 ⼊流。 3…

STL之priority_queue篇——深入剖析C++中优先队列的实现原理、核心特性及其底层机制

文章目录 前言一、补充内容&#xff1a;堆1.1 什么是堆1.2 堆的分类与性质1.3 堆的向下调整算法&#xff08;小根堆&#xff09;实现流程&#xff1a;代码&#xff1a; 1.4 堆的向上调整算法&#xff08;小根堆&#xff09;实现流程&#xff1a;代码&#xff1a; 1.5 数组建堆算…

eclpsexxx

Copyright?2001-2004 International Business Machines Corp. Guidelines Eclipse 用户界面指南 2.1 版 查看目录 作者&#xff1a;Nick Edgar, Kevin Haaland, Jin Li , Kimberley Peter 译者&#xff1a;Bobbie Wang&#xff0c;Qi Liang 最新更新: 2004年2月 注意 您…

kaggle实战2信用卡反欺诈逻辑回归模型案例1

信用卡欺诈案例 数据集下载地址 https://storage.googleapis.com/download.tensorflow.org/data/creditcard.csv 参考不平衡数据的分类 文章目录 只进行特征衍生&#xff0c;未进行数据标准化、上才样处理数据不平衡问题&#xff0c;得到的准确率和召回率居然很高如果不处理数据…

李宏毅 X 苹果书 自注意力机制 学习笔记上

self attention 是一种network架构使用场景&#xff1a;输入一组向量&#xff0c;这组向量的性质&#xff1a;数量有变化&#xff0c;序列长度不一 模型输入 文字处理&#xff1a; 模型输入&#xff1a;句子&#xff08;句子的长度&#xff0c;单词都不一样&#xff09;&am…

qt QMainWindow 自定义标题栏

可以使用setMenuWidget 来将自定义的标题栏 QWidget 设置进去就可以&#xff0c; 用来替代setMenu 菜单栏单一&#xff0c;自定义不高的问题

node_exporter使用textfile collector收集业务数据

上一篇文章讲了使用Pushgateway收集业务数据的方法&#xff0c;今天讲另外一种方式textfile collector The textfile collector is similar to the Pushgateway, in that it allows exporting of statistics from batch jobs. The Pushgateway should be used for service-leve…

解决ModuleNotFoundError: No module named ‘torchcrf‘

运行深度学习程序时候&#xff0c;出现报错&#xff1a;ModuleNotFoundError: No module named torchcrf 将 from torchcrf import CRF 改为 from TorchCRF import CRF

无设计器简单实例

目录 1、界面设计Qt5元对象系统1. **QObject 类**2. **QMetaObject**3. **信号和槽机制**4. **宏&#xff1a;Q_OBJECT**5. **动态属性**6. **反射机制**7. **元对象编译器&#xff08;MOC&#xff09;** 2、完成程序功能 1、界面设计 不点创建界面 在dialog.h中 #ifndef DIA…

树莓派5里使用protobuf

由于现在protobuf越来越复杂了&#xff0c;自己去编译&#xff0c;还是比较麻烦。 比如最新的V28版本&#xff0c;就会要求使用cmake或者bazel来编译了。 如果不要求使用最新的版本&#xff0c;直接使用系统里带的版本也是可以的。 可以进行如下操作&#xff1a; sudo apt …

【算法系列-链表】交换链表节点(反转 + 交换)

【算法系列-链表】交换链表节点(反转 交换) 文章目录 【算法系列-链表】交换链表节点(反转 交换)1. 反转链表1.1 思路分析&#x1f3af;1.2 解题过程&#x1f3ac;1.3 代码示例&#x1f330; 2. 两两交换链表中的节点2.1 思路分析&#x1f3af;2.2 解题过程&#x1f3ac;2.3 …

电器自动化入门08:隔离变压器、行程开关介绍及选型

视频链接&#xff1a;3.4 电工知识&#xff1a;三相交流异步电动机自动往返行程控制及控制变压器选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p8&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.隔离&#xff08;控制&#xff09;变压器 2.行程开…

C++_智能指针详解

什么是智能指针&#xff1f;为什么要有智能指针&#xff1f;到目前为止&#xff0c;我们编写的程序所使用的对象都有着严格定义的生命周期。比如说&#xff0c;全局对象在程序启动时分配&#xff0c;在程序结束时销毁&#xff1b;再比如说局部static对象在第一次使用前分配&…

4.5章节python中的break和continue语句的作用

在Python中&#xff0c;break 和 continue 是两个用于控制循环流程的关键字。它们提供了在特定条件下提前退出循环或跳过当前迭代并进入下一次迭代的机制。 一、break语句 break 语句用于立即终止当前的循环&#xff08;无论是 for 循环还是 while 循环&#xff09;&#xff…

最佳人力资源管理工具,6款热门产品功能对比

文章介绍了ZohoPeople、北森、i人事等六款主流人力资源管理系统&#xff0c;涵盖招聘、培训、考勤等功能&#xff0c;各有特点&#xff0c;适合不同规模企业需求。建议企业试用后选择&#xff0c;提高管理效率。 一、Zoho People Zoho People是一款强大的云端人力资源管理系统…

看Threejs好玩示例,学习创新与技术(LiquidRaymarching)

今天的示例有点超出我的想象&#xff0c;首先会科普下WGSL这种新的着色器脚本&#xff0c;然后说说示例《Liquid Raymarching Scene with Three.js Shading Language | Codrops (tympanus.net)》的技术流程。本示例最终呈现的效果如下。可以看到他跟QQ那个消息拖拽消灭的效果非…

Flink 03 | 数据流基本操作

Flink数据流结构 DataStream 转换 通常我们需要分析的业务数据可能存在如下问题&#xff1a; 数据中包含一些我们不需要的数据 数据格式不方面分析 因此我们需要对原始数据流进行加工&#xff0c;比如过滤、转换等操作才可以进行数据分析。 “ Flink DataStream 转换主要作…