网站怎么做站内美化/济南网站seo公司

网站怎么做站内美化,济南网站seo公司,彩投网站建设,安卓开发工具下载Java 8 改进的 ConcurrentHashMap:归约、搜索、计数与 Set 视图详解 Java 8 对 ConcurrentHashMap 进行了重大优化,不仅提升了并发性能,还引入了许多函数式编程方法,使其在处理高并发场景时更加高效和灵活。本文将深入解析 Concu…

Java 8 改进的 ConcurrentHashMap:归约、搜索、计数与 Set 视图详解

Java 8 对 ConcurrentHashMap 进行了重大优化,不仅提升了并发性能,还引入了许多函数式编程方法,使其在处理高并发场景时更加高效和灵活。本文将深入解析 ConcurrentHashMap 的以下改进特性:并行归约并行搜索计数方法Set 视图,并通过代码示例展示其应用场景。


一、并行归约(Reduce)

作用

ConcurrentHashMapreduce 方法允许在多线程环境下对键、值或键值对进行并行聚合操作(如求和、求最大值等),充分利用多核 CPU 的性能优势。

核心方法
// 对键和值进行归约
<U> U reduce(long parallelismThreshold,BiFunction<? super K, ? super V, ? extends U> transformer,BiFunction<? super U, ? super U, ? extends U> reducer);// 对值进行归约
V reduceValues(long parallelismThreshold,BiFunction<? super V, ? super V, ? extends V> reducer);
  • 参数
    • parallelismThreshold:并行处理的阈值,当元素数量超过此值时启用并行计算。
    • transformer:将键值对转换为中间结果的函数。
    • reducer:合并中间结果的函数。
示例:计算所有值的总和
ConcurrentHashMap<String, Integer> scores = new ConcurrentHashMap<>();
scores.put("Alice", 90);
scores.put("Bob", 85);
scores.put("Charlie", 95);// 对所有值求和
int sum = scores.reduceValues(1, (v1, v2) -> v1 + v2);
System.out.println("总分: " + sum); // 输出: 总分: 270

二、并行搜索(Search)

作用

search 方法用于在 ConcurrentHashMap 中并行查找满足条件的键、值或键值对,一旦找到匹配项立即返回结果,避免遍历整个集合。

核心方法
// 搜索键值对
<U> U search(long parallelismThreshold,BiFunction<? super K, ? super V, ? extends U> searchFunction);// 搜索值
V searchValues(long parallelismThreshold,Function<? super V, ? extends V> searchFunction);
示例:查找第一个大于 90 的分数
Integer result = scores.searchValues(1, v -> v > 90 ? v : null);
System.out.println("大于90的分数: " + result); // 输出: 大于90的分数: 95

三、计数方法(mappingCount

作用

mappingCount 方法返回 Map 中的键值对数量,返回类型为 long。与传统的 size() 方法相比,它避免了 Integer 溢出问题,适用于大规模数据统计。

语法
long mappingCount();
示例
System.out.println("条目数: " + scores.mappingCount()); // 输出: 条目数: 3
对比 size() 方法
  • size():返回 int,可能因数据量过大导致溢出。
  • mappingCount():返回 long,更安全且适合高并发环境。

四、Set 视图的线程安全改进

ConcurrentHashMapkeySetvaluesentrySet 返回的视图是线程安全的,并支持直接在视图上进行并发操作。

1. keySet 视图
ConcurrentHashMap.KeySetView<String, Integer> keys = scores.keySet();
keys.add("Dave"); // 等同于 scores.put("Dave", null);(需注意默认值)
2. entrySet 视图的并行遍历
scores.entrySet().forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue())
);
3. 线程安全操作示例
// 多线程环境下安全操作
Set<String> keys = scores.keySet();
new Thread(() -> keys.remove("Alice")).start();
new Thread(() -> keys.add("Eve")).start();

五、其他实用方法

1. forEach 并行遍历
scores.forEach(2, (k, v) -> System.out.println(k + " -> " + v)
);
2. computemerge

HashMap 类似,但保证原子性:

scores.compute("Alice", (k, v) -> v + 10); // Alice的分数变为100
scores.merge("Bob", 85, Integer::sum);     // 若存在则累加

六、注意事项

  1. 并行阈值设置
    parallelismThreshold 控制并行计算的触发条件。若设为 Long.MAX_VALUE,则始终串行执行;设为 1 则强制并行。

  2. 线程安全与一致性
    ConcurrentHashMap 的迭代器是“弱一致性”的,反映的是遍历开始时的状态,可能不包含后续修改。

  3. 避免副作用
    reducesearch 函数中避免修改 Map,否则可能导致不可预测的行为。


七、完整示例代码

import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapDemo {public static void main(String[] args) {ConcurrentHashMap<String, Integer> scores = new ConcurrentHashMap<>();scores.put("Alice", 90);scores.put("Bob", 85);scores.put("Charlie", 95);// 归约:计算总分int sum = scores.reduceValues(1, Integer::sum);System.out.println("总分: " + sum);// 搜索:查找第一个大于90的值Integer found = scores.searchValues(1, v -> v > 90 ? v : null);System.out.println("大于90的分数: " + found);// 计数System.out.println("条目数: " + scores.mappingCount());// Set视图操作scores.keySet().forEach(System.out::println); // 输出所有键}
}

输出

总分: 270
大于90的分数: 95
条目数: 3
Alice
Bob
Charlie

八、总结

Java 8 对 ConcurrentHashMap 的改进使其在高并发场景下表现更卓越:

  • 并行归约与搜索:利用多核性能加速聚合和查找。
  • mappingCount:安全统计大规模数据。
  • 线程安全的 Set 视图:支持直接并发操作。
  • 函数式方法:如 forEachcompute,代码更简洁。

这些改进不仅提升了性能,还显著增强了代码的可读性和可维护性。在处理高并发数据时,合理利用 ConcurrentHashMap 的新特性,能让你的程序如虎添翼!

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

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

相关文章

【动手学深度学习】#4 深度学习计算

主要参考学习资料&#xff1a; 《动手学深度学习》阿斯顿张 等 著 【动手学深度学习 PyTorch版】哔哩哔哩跟李牧学AI 概述 为了实现更复杂的网络&#xff0c;我们需要研究比层更高一级的单元块&#xff0c;在编程中由类表示。通过自定义层和块&#xff0c;我们能更灵活地搭建网…

如何在 Windows 上安装并使用 Postman?

Postman 是一个功能强大的API测试工具&#xff0c;它可以帮助程序员更轻松地测试和调试 API。在本文中&#xff0c;我们将讨论如何在 Windows 上安装和使用 Postman。 Windows 如何安装和使用 Postman 教程&#xff1f;

26考研——图_图的基本概念(6)

408答疑 文章目录 一、图的基本概念图的定义非空性非线性结构 顶点和边的表示顶点边 有向图 & 无向图有向图有向图 G 1 G_1 G1​ 的表示 无向图无向图 G 2 G_2 G2​ 的表示 简单图 & 多重图简单图多重图 顶点的度、入度和出度顶点的度有向图的度 路径、路径长度和回路…

面向对象软件工程实践软件案例

智力运动-数字化思维训练课程介绍 数字化思维训练是科技赋能素质教育创新实践项目&#xff0c;通过数字化信息化手段&#xff0c;深度融合优质原创智力运动教育课程资源&#xff0c;服务幼儿园与小学&#xff0c;提供信息时代校园素质教育教学解决方案。在《面向对象软件工程》…

Linux学习笔记(应用篇一)

基于I.MX6ULL.MINI开发板 标准I/O库链接目录删除文件正则表达式系统标识时间堆内存信号标准信号 进程进程组进程间通信线程互斥锁线程安全 本文章是入门篇的概念&#xff0c;有点零散&#xff0c;后续需要补充复习 **inode&#xff08;索引节点&#xff09;**是 Linux 和 Unix …

医学交互作用分析步骤和目的(R语言)

医学交互作用分析的目的和用途&#xff08;R语言&#xff09; 医学交互作用分析一直是医学数据分析的组成部分&#xff0c;总结最近的一些认识。 目的&#xff1a; 在独立危险因素鉴定的研究中&#xff0c;&#xff08;独立危险因素的&#xff09;交互作用可以作为独立危险因…

Javaweb后端登录会话技术jwt令牌

jwt生成与校验 是base4补位的 最后面是签名&#xff0c;签名不是base64&#xff0c;是通过签名算法加密后来的 令牌长度不是固定的&#xff0c;长度取决于原始内容&#xff0c;载荷&#xff0c;大小 头有&#xff0c;类型&#xff0c;签名算法 base64可以对任意的二进制数据进…

Mybatis操作数据库(注解+xml两个方式)

文章目录 1.个人回顾2.关于mybatis注解的说明3.字段和属性不匹配的解决方案3.1第一个方案3.2第二个方案3.3第三个方案 4.xml路径配置5.xml里面的字段映射 1.个人回顾 刚刚翻看了一下自己的这个之前写的博客&#xff0c;上一次和这个javaee相关的博客还是去年写的&#xff0c;也…

SysVinit和Systemd的系统运行级别

Linux运行级别 SysVinit系统(init守护进程)Linux系统运行级别SysVinit系统(init守护进程)查看Linux运行级别SysVinit系统(init守护进程)修改运行级别&#xff1a; Systemd守护进程Linux系统运行级别systemd查看运行级别Systemd查看系统当前运行级别 systemd修改运行级别multi-u…

vscode终端不识别npm 无法解析npm

vscode 用以管理员打开识别npm vscode 用普通用户打开不识别npm 刚换了一台新电脑&#xff0c;寻思安装各种环境&#xff0c;一顿操作猛如虎&#xff0c;当最后一个打开vscode后&#xff0c;运行项目发现&#xff0c;新建终端>npm run dev 无法识别。 在cmd 中 打node -…

如何理解 Apache Iceberg 与湖仓一体(Lakehouse)?

一、什么是湖仓一体&#xff08;Lakehouse&#xff09;&#xff1f; 湖仓一体是一种融合了数据湖的灵活存储能力与数据仓库的高效分析功能的现代数据架构。它通过整合两者的优势&#xff0c;解决了传统架构的局限性&#xff0c;为企业数据处理提供了更全面的解决方案。 数据湖…

【鸿蒙开发】Hi3861学习笔记- TCP客户端

00. 目录 文章目录 00. 目录01. TCP概述02. TCP应用场景03. TCP和UDP比较04. TCP相关API05. TCP编程流程06. 硬件设计07. 软件设计08. 实验现象09. 附录 01. TCP概述 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接、可靠的传输层协议&#xff0c;旨…

2025-03-25 学习记录--C/C++-PTA 习题9-3 平面向量加法

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题9-3 平面向量加法 本题要求编写程序&#xff0c;计算两个二维平面向量的和向量。 输入格式: ❀ 输入在…

23种设计模式-桥接(Bridge)设计模式

桥接设计模式 &#x1f6a9;什么是桥接设计模式&#xff1f;&#x1f6a9;桥接设计模式的特点&#x1f6a9;桥接设计模式的结构&#x1f6a9;桥接设计模式的优缺点&#x1f6a9;桥接设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是桥接设计模式…

go:前后端分离

1.前端代码 新建一个前端文件夹&#xff0c;在该文件夹下新建一个.html文件&#xff0c;写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下&#xff1a; func main() { // 服务运行提示 fmt.Println("go web server is runn…

JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南&#xff0c;你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像 解压出.img文件并记下它在计算机上的…

文件I/O--C++的文件操作

一、打开文件&#xff0c;从文件中读取、写入文件 从文件中读取数据&#xff1a; #include<fstream> //fstream File stream:文件流 #include<iostream> //fstream包含了 iostream&#xff0c;所以这句可以省略&#xff0c;现在不能了 using namespace std;i…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

基于vue.js开发的家庭装修管理系统开发与设计(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本家庭装修管理系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Node.js语言进行编写&#xff0c;使用了VUE框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。用户的功能包括&#xff1a;注册、登录、浏览首页…

OpenCV图像拼接(5)图像拼接模块的用于创建权重图函数createWeightMap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数&#xff0c;主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…