点击上方“方志朋”,选择“设为星标”

回复”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%相关推荐

  1. 不止 JDK7 的 HashMap ,JDK8 的 ConcurrentHashMap 也会造成 CPU 100%?原因与解决~

    现象 大家可能都听过JDK7中的HashMap在多线程环境下可能造成CPU 100%的现象,这个由于在扩容的时候put时产生了死链,由此会在get时造成了CPU 100%.这个问题在JDK8中的Has ...

  2. jdk8的ConcurrentHashMap实现

    ConcurrentHashMap在jdk7的使用的是分段锁(ReentrantLock),而jdk8则改为使用synchronized.同时jdk8的ConcurrentHashMap和HashMa ...

  3. 集合之比较接口器+Map家族的HashMap+LinkedHashMap+Hashtable+ConcurrentHashMap

    集合之比较接口器+Map家族的HashMap+LinkedHashMap+Hashtable+ConcurrentHashMap 一.比较器接口 1.内置比较器 – Comparable import ...

  4. hashmap的特性?HashMap底层源码,数据结构?Hashmap和hashtable ConcurrentHashMap区别?

    1.hashmap的特性? 允许空键和空值(但空键只有一个,且放在第一位) 元素是无序的,而且顺序会不定时改变 key 用 Set 存放,所以想做到 key 不允许重复,key 对应的类需要重写 ha ...

  5. JDK7中HashMap源码分析

    文章目录 JDK7中的HashMap 一.JDK7中HashMap源码中重要的参数 二.JDK7中HashMap的构造方法 三.JDK7中创建一个HashMap的步骤 四.JDK7中HashMap的p ...

  6. Java中的Map集合及其子类HashMap,LinkedHashMap,TreeMap,ConcurrentHashMap

    一 .Map public interface Map<K,V> 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.此接口哦取代了Dictionary类,后者完全是 ...

  7. HashMap 为什么会导致 CPU 100%?文章看不懂?

    来自:Java中文社群 无论是在实际工作中还是在面试中,HashMap 无疑是使用频率最高的知识点之一,所以我们需要搞懂每一个关于 HashMap 的知识点才行. 哈喽,大家好,我是老王,欢迎来到 J ...

  8. HashMap 为什么会导致 CPU 100%?文章看不懂?来看这个视频吧!——面试突击 006 期...

    无论是在实际工作中还是在面试中,HashMap 无疑是使用频率最高的知识点之一,所以我们需要搞懂每一个关于 HashMap 的知识点才行. 哈喽,大家好,我是老王,欢迎来到 Java 面试突击,我们今 ...

  9. JDK8之ConcurrentHashMap源码解读

    本文默认读者阅读过JDK8的HashMap源码,不再对源码中的红黑树操作进行分析. 本文主要对put().transfer().addCount()进行分析(replaceNode()源码近似于put ...

最新文章

  1. 网络中最常用的网络命令(2)-完整参数
  2. “2012年度IT博客大赛”获奖感言--梦想、学习、坚持、自信、淡定
  3. 工作流中切换数据库时---“禁止流转”
  4. dependency 中的 classifier属性
  5. wrapper怎么用_用责任链模式设计拦截器
  6. 这个可能打败Python的编程语言,正在征服科学界
  7. python未定义名称大小_名称错误:未定义名称“高度”
  8. 面向过程和面向对象的区别,通俗易懂
  9. 计算机视觉教程2-5:图像金字塔送她一朵玫瑰(附代码)
  10. mysql查看cpu使用高sql语句_MYSQL CPU 使用率高,怎么查,怎么破
  11. 【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.8-9.10】
  12. 自己 总结 一些 学习上 鼓励自己的 话~共勉哟
  13. windows7 中pkeyconfig.xrm-ms文件无法删除解决办法
  14. 360度全景标定方法_全景摄像机标定方法综述
  15. 微型计算机最早出现在第三代计算机中对吗,3月计算机一级试题及答案(2)
  16. Bootstrap03
  17. C++ 快读快输模板
  18. 电脑能正常上网,但是不能连接共享的打印机 电脑无法打印 服务打开无法打印
  19. flex前端+java后台实现Flex导出Excel的两种方法,
  20. 医咖会免费STATA教程学习笔记——计算变量的置信区间

热门文章

  1. Java IO 4 : RandomAccessFile
  2. python 列表使用
  3. device.cpp
  4. DB2 9 利用开辟(733 测验)认证指南,第 1 部分: 数据库工具与编程步调(6)
  5. 股市币市:数据分析与交易所最新公告
  6. 又有六所大学考研预调剂系统已开放!
  7. 如何让机器像人一样多角度思考?协同训练来帮你
  8. 程序员编程时戴耳机是在听什么?
  9. 重磅!Google推出了Python最牛X的编辑器......
  10. 智能音箱玩出新花样?这家公司推出2699元的智能虚拟机器人