JDK7多线程并发环境HashMap死循环infinite loop,CPU拉满100%,Java

JDK7多线程并发环境HashMap死循环infinite loop,CPU拉满100%,Java

HashMap底层数据实现是数组+链表,链表在哈希碰撞后装入新数据,像是一个桶。

HashMap在JDK7的实现中,并发环境存在死循环infinite loop问题。导致的结果之一是程序在多线程并发环境下,运行到某些时机,CPU拉满100%,杀掉进程启动后程序恢复正常,但是再次启动,多线程的并发环境下再跑到一定时机(get操作后开始死循环),又会把CPU拉满100%(陷入死循环)。

HashMap在并发的多线程环境下扩容造成死循环。通常在初始化HashMap时候会有一个loadFactore负载因子比如0.75,当原先存储的元素size达到固有长度的0.75后,开始扩容,扩容过程用头插法把oldTable单链表的节点插入到newTable单链表,newTable单链表倒置了oldTable中的单链表。

于是,多线程并发扩容场景下很可能导致扩容后的HashMap产生一个有环的单链表,进而导致后续get取数据陷入死循环,CPU拉满100%。

新链表的顺序跟旧的链表是完全相反的,只要保证建新链还是原来顺序就不会产生循环,JDK8用 head 和 tail 来保证链表顺序和之前一样,就不会产生循环引用。

结论:JDK8中,Java修正了该问题,但HashMap始终存在线程安全问题,比如并发put会发生数据覆盖,所以避免在多线程并发环境用HashMap,如果是并发多线程环境,请:

1、ConcurrentHashMap替代HashMap。

2、使用 synchronized 或 lock 加锁HashMap。(效率低)

LinkedHashMap实现LRU缓存cache机制,Kotlin_zhangphil的博客-CSDN博客* * 基于Java LinkedList,实现Android大数据缓存策略 * 作者:Zhang Phil * 原文出处:http://blog.csdn.net/zhangphil * * 实现原理:原理的模型认为:在LinkedList的头部元素是最旧的缓存数据,在L_android大数据缓存。一句话概括的说:两者最大的不同就是,HashMap不保证put进去的数据的顺序;例如,假如在HashMap中依次、顺序添加元素:1,2,3,4,5,在遍历HashMap时输出的顺。https://blog.csdn.net/zhangphil/article/details/132604797Java的HashMap与LinkedHashMap异同_zhangphil的博客-CSDN博客一句话概括的说:两者最大的不同就是,HashMap不保证put进去的数据的顺序;而LinkedHashMap则保证put进去的数据的顺序。换句话也就是说,HashMap添加进去的数据顺序和遍历时的数据顺序不一定;而LinkedHashMap则保证添加时数据顺序是什么,遍历时数据顺序是什么。例如,假如在HashMap中依次、顺序添加元素:1,2,3,4,5,在遍历HashMap时输出的顺https://blog.csdn.net/zhangphil/article/details/44115629

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

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

相关文章

算法训练第五十七天

516. 最长回文子序列 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; class Solution { public:int longestPalindromeSubseq(string s) {vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));for(int i 0;i < s.size();i){dp[i][i]…

PostgreSQL在进行除法时要注意

背景 整型除以整型&#xff0c;正常情况下当然得到的应该也是整型。数据库也是这么干的。 但是在数据库应用中&#xff0c;通常业务的需求是得到NUMERIC&#xff0c;不能直接把小数干掉。 数据库的行为给用户带来了诸多不便&#xff0c;例如1除以2&#xff0c;如果是整型除法会…

异常-java

目录 一、异常的概念和体系结构 1.1 异常的概念 1.2 异常的体系结构 1.3 异常的分类 二、异常的处理 2.1 防御式编程 2.2 异常抛出 2.3 异常捕获 2.4 异常处理流程 三、自定义异常类 一、异常的概念和体系结构 1.1 异常的概念 程序员在开发过程中&#xff0c;想要将代码写得…

<C++> STL_set/map

1.关联式容器 CSTL包含了序列式容器和关联式容器&#xff1a; 序列式容器里面存储的是元素本身&#xff0c;其底层为线性序列的数据结构。比如&#xff1a;vector&#xff0c;list&#xff0c;deque&#xff0c;forward_list(C11)等。关联式容器里面存储的是<key, value&g…

Centos7 + Apache Ranger 2.4.0 部署

一、Ranger简介 Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。 1、组件列表 # Service Name Liste…

Springboot - 13.spring-boot-starter-security集成

&#x1f440;Spring Boot Starter Security 中文文档 Spring Security中文文档 &#x1f440;Spring Boot Starter Security 运行流程 当然可以。首先&#xff0c;我们会将用户存储和认证的流程融入整个Spring Boot Starter Security的使用流程中。以下是当你使用Spring Bo…

Excel VSTO开发4 -其他事件

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 4 其他事件 针对插件的事件主要有Startup、Shutdown这两个事件&#xff0c;在第2节中已经讲解。在开发窗口中&#xff0c;选择对象…

微信小程序检查版本更新

新建文件 version-util.js // 小程序启动时检查版本 class VersionUtil {/*** 检查更新*/checkUpdate(){const updateManager wx.getUpdateManager();updateManager.onCheckForUpdate((hasUpdate)>{if(hasUpdate){updateManager.onUpdateReady(()>{wx.showModal({title…

“谁天生是项目经理?四大特质决定你的机会“

大家好&#xff0c;我是老原。 但其实不少刚开始尝试项目管理的人&#xff0c;包括老原自己也曾经遇到过这样的问题&#xff1a; ▪ 自己没权没势&#xff0c;大家凭什么听我的&#xff1f; ▪ 资源受限&#xff0c;如何向老板争取更多资源&#xff1f; ▪ 怎样才能推进多方…

WebAssembly 在云原生中的实践指南

1 WebAssembly 介绍 WebAssembly&#xff08;Wasm&#xff09;是一种通用字节码技术&#xff0c;它可以将其他编程语言&#xff08;如 Go、Rust、C/C 等&#xff09;的程序代码编译为可在浏览器环境直接执行的字节码程序。 WebAssembly 的初衷之一是解决 JavaScript 的性能问…

【月报】Aavegotchi 开发进度更新 - 2023 年 8 月

嗨&#xff0c;Gotchigang&#xff01;2023 年的进程已经过了一半&#xff0c;我们团队一直在努力推动 Aavegotchi 生态系统迈向新的高度&#xff01;在本月的开发更新中&#xff0c;我们将分享在以下方面取得的进展&#xff1a; ● Gotchi 游戏 ● Gotchichain ● Aavegotc…

【iVX】十五分钟制作一款小游戏,iVX真有怎么神?

个人主页&#xff1a;【&#x1f60a;个人主页】 新人博主&#xff0c;喜欢就关注一下呗~ 文章目录 前言iVX介绍初上手布置背景制作可移动物体总结&#xff08;完善步骤&#xff09; 前言 在上篇文章中&#xff0c;我向大家介绍了一种打破常规的编程方式——iVX&#xff0c;可…

Go map转json

在Go中如何返回前端 字段名称/数量都不确定的json数据&#xff1f; 之前用Go写web服务&#xff0c;返回给前端的json格式的接口&#xff0c;有哪些要返回的字段都是明确的。都是预先定义一个结构体&#xff0c;json.Marshal一下即可~ 但当有的场景&#xff0c;要返回哪些字段不…

代码随想录day43|1049. 最后一块石头的重量 II494. 目标和474. 一和零

1049. 最后一块石头的重量 II class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:target int(sum(stones)/2)dp [0] * (target1)for i in stones:for j in range(target ,-1 ,-1):if j>i:dp[j] max(dp[j],dp[j-i]i)# print(dp)return sum(stone…

RabbitMQ:hello结构

1.在Linux环境上面装入rabbitMQ doker-compose.yml version: "3.1" services:rabbitmq:image: daocloud.io/library/rabbitmq:managementrestart: alwayscontainer_name: rabbitmqports:- 6786:5672- 16786:15672volumes:- ./data:/var/lib/rabbitmq doker-compos…

【C++】函数重载 ④ ( 函数指针定义的三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )

文章目录 一、函数指针定义方法1、直接定义函数指针2、通过 函数类型 定义 函数指针3、通过 函数指针类型 定义 函数指针4、代码示例 - 不同方式定义函数指针 博客总结 : 重载函数 : 使用 相同 的 函数名 , 定义 不同 的 函数参数列表 ;判定标准 : 只有 函数参数 的 个数 / 类…

ConfigMaps in K8s

摘要 ConfigMaps是Kubernetes&#xff08;K8s&#xff09;中用于存储应用程序配置信息的一种资源对象。它将key-value对存储为Kubernetes集群中的一个资源&#xff0c;并可以在Pod中以卷或环境变量的形式使用。 ConfigMaps的设计目的是将应用程序配置与应用程序本身解耦。它可…

安全狗亮相厦门市第五届网络安全宣传周开幕式

9月5日&#xff0c;厦门市第五届网络安全宣传周开幕式成功举行。 作为国内云原生安全领导厂商&#xff0c;安全狗也受邀参与此次大会。 据悉&#xff0c;此次主要包含领导致辞、厦门市第五届网络安全宣传周亮点活动介绍、厦门市第二届网络安全攻防演练优秀组织奖颁奖、厦门市…

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)

目录 前言 一、SpringMVC之常用注解 1. 注解说明 2. 扩展延伸 3. 注解的作用展示 导入slf4j的相关依赖及配置项目 pom.xml文件 二、参数传递 1. 基础类型String类型 测试代码 测试结果 页面 控制台 2. 复杂类型 测试代码 测试结果 页面 控制台 ​编辑 3. Req…

Linux创建新文件的几种方式

第一种是 vi 文件名&#xff0c;然后进入vi编辑&#xff0c;完了之后保存退出&#xff1b;然后ls看一下&#xff0c;文件有了&#xff1b; 在终端输入 cat > 文件名&#xff0c;这没用过&#xff1b;输入以后回车&#xff0c;不会退出命令&#xff1b;输入一行文字&#xff…