不止JDK7的HashMap,JDK8的ConcurrentHashMap也会造成CPU 100%
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试资料
作者:朱小厮
公众号:朱小厮的博客(ID:hiddenkafka)
大家可能都听过JDK7中的HashMap在多线程环境下可能造成CPU 100%的现象,这个由于在扩容的时候put时产生了死链,由此会在get时造成了CPU 100%。这个问题在JDK8中的HashMap获得了解决。其实JDK7中的HashMap在多线程环境下不止只有CPU 100%这一共怪异现象,它还可能造成插入的数据丢失,有兴趣的读者可以自行了解下。
对于HashMap多线程的问题,我们通常会这么反问:HashMap设计上就不是多线程安全的,何必要去在多线程环境下用呢?的确如此,我们不会傻到显式的在多线程环境下调用,但是又可能在你所关注的视角范围外是多线程的,其隐式地让HashMap置于多线程环境下了,这个又难以一下子察觉到。再者,对于HashMap多线程的问题,我们很多时候推荐使用ConcurrentHashMap来代替HashMap应用于多线程的环境,很不巧的是ConcurrentHashMap也有可能会造成CPU 100%的异常现象。这个怪异现象存在于JDK8的ConcurrentHashMap中,在JDK9中已经得到修复,可以参见:
https://bugs.openjdk.java.net/browse/JDK-8062841
什么情况下JDK8的ConcurrentHashMap会出现这个Bug呢?首先我们来运行一下这段代码:
你会惊奇的发现这个程序一直处于Running状态,我们通过top -Hp [pid]命令查看到其中一个线程的CPU使用率接近100%,参考下图:
可以看到pid为31417的东东,我们再通过jstack -l [pid]命令查看到对应的线程为:
注意将nid=0x7ab9的16进制转为10进制就是31417。可以看到问题是发生在了computeIfAbsent方法中,我们将示例中的程序换成下面这段程序也会同样出现CPU 100%的Bug:
问题的关键在于递归使用了computeIfAbsent方法,笔者在stackoverflow上还搜索到了同类型的问题,下面的示例程序中调用fibonacci方法同样也会造成CPU 100%.
至于为什么会发生这个BUG,答案就在ConcurrentHashMap中的computeIfAbsent方法中,自己去捞吧,嘿嘿。或者等以后的文章。怎么规避这个问题呢?只要不在递归中使用computeIfAbsent方法就好啦,或者降级用可爱的分段锁,或者升级JDK9。
热门内容:
一个员工的离职成本到底有多恐怖!
感受lambda之美,推荐收藏,需要时查阅
某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?
我的面试标准:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架!
聊聊前后端分离接口规范
RESTful 架构基础
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
不止JDK7的HashMap,JDK8的ConcurrentHashMap也会造成CPU 100%相关推荐
- 不止 JDK7 的 HashMap ,JDK8 的 ConcurrentHashMap 也会造成 CPU 100%?原因与解决~
现象 大家可能都听过JDK7中的HashMap在多线程环境下可能造成CPU 100%的现象,这个由于在扩容的时候put时产生了死链,由此会在get时造成了CPU 100%.这个问题在JDK8中的Has ...
- jdk8的ConcurrentHashMap实现
ConcurrentHashMap在jdk7的使用的是分段锁(ReentrantLock),而jdk8则改为使用synchronized.同时jdk8的ConcurrentHashMap和HashMa ...
- 集合之比较接口器+Map家族的HashMap+LinkedHashMap+Hashtable+ConcurrentHashMap
集合之比较接口器+Map家族的HashMap+LinkedHashMap+Hashtable+ConcurrentHashMap 一.比较器接口 1.内置比较器 – Comparable import ...
- hashmap的特性?HashMap底层源码,数据结构?Hashmap和hashtable ConcurrentHashMap区别?
1.hashmap的特性? 允许空键和空值(但空键只有一个,且放在第一位) 元素是无序的,而且顺序会不定时改变 key 用 Set 存放,所以想做到 key 不允许重复,key 对应的类需要重写 ha ...
- JDK7中HashMap源码分析
文章目录 JDK7中的HashMap 一.JDK7中HashMap源码中重要的参数 二.JDK7中HashMap的构造方法 三.JDK7中创建一个HashMap的步骤 四.JDK7中HashMap的p ...
- Java中的Map集合及其子类HashMap,LinkedHashMap,TreeMap,ConcurrentHashMap
一 .Map public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口哦取代了Dictionary类,后者完全是 ...
- HashMap 为什么会导致 CPU 100%?文章看不懂?
来自:Java中文社群 无论是在实际工作中还是在面试中,HashMap 无疑是使用频率最高的知识点之一,所以我们需要搞懂每一个关于 HashMap 的知识点才行. 哈喽,大家好,我是老王,欢迎来到 J ...
- HashMap 为什么会导致 CPU 100%?文章看不懂?来看这个视频吧!——面试突击 006 期...
无论是在实际工作中还是在面试中,HashMap 无疑是使用频率最高的知识点之一,所以我们需要搞懂每一个关于 HashMap 的知识点才行. 哈喽,大家好,我是老王,欢迎来到 Java 面试突击,我们今 ...
- JDK8之ConcurrentHashMap源码解读
本文默认读者阅读过JDK8的HashMap源码,不再对源码中的红黑树操作进行分析. 本文主要对put().transfer().addCount()进行分析(replaceNode()源码近似于put ...
最新文章
- 网络中最常用的网络命令(2)-完整参数
- “2012年度IT博客大赛”获奖感言--梦想、学习、坚持、自信、淡定
- 工作流中切换数据库时---“禁止流转”
- dependency 中的 classifier属性
- wrapper怎么用_用责任链模式设计拦截器
- 这个可能打败Python的编程语言,正在征服科学界
- python未定义名称大小_名称错误:未定义名称“高度”
- 面向过程和面向对象的区别,通俗易懂
- 计算机视觉教程2-5:图像金字塔送她一朵玫瑰(附代码)
- mysql查看cpu使用高sql语句_MYSQL CPU 使用率高,怎么查,怎么破
- 【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.8-9.10】
- 自己 总结 一些 学习上 鼓励自己的 话~共勉哟
- windows7 中pkeyconfig.xrm-ms文件无法删除解决办法
- 360度全景标定方法_全景摄像机标定方法综述
- 微型计算机最早出现在第三代计算机中对吗,3月计算机一级试题及答案(2)
- Bootstrap03
- C++ 快读快输模板
- 电脑能正常上网,但是不能连接共享的打印机 电脑无法打印 服务打开无法打印
- flex前端+java后台实现Flex导出Excel的两种方法,
- 医咖会免费STATA教程学习笔记——计算变量的置信区间
热门文章
- Java IO 4 : RandomAccessFile
- python 列表使用
- device.cpp
- DB2 9 利用开辟(733 测验)认证指南,第 1 部分: 数据库工具与编程步调(6)
- 股市币市:数据分析与交易所最新公告
- 又有六所大学考研预调剂系统已开放!
- 如何让机器像人一样多角度思考?协同训练来帮你
- 程序员编程时戴耳机是在听什么?
- 重磅!Google推出了Python最牛X的编辑器......
- 智能音箱玩出新花样?这家公司推出2699元的智能虚拟机器人