ConcurrentHashMap也有可能会造成CPU 100%的异常现象

1、JDK7
A、JDK7中的HashMap在多线程环境下不止只有CPU 100%这一共怪异现象
B、HashMap在多线程环境下它还可能造成插入的数据丢失
JDK7中的HashMap在多线程环境下可能造成CPU 100%的现象,这个由于在扩容的时候put时产生了死循环,由此会在get时造成了CPU 100%。所以在并发情况下不能使用HashMap,这个问题在JDK8中的HashMap获得了解决。
ConcurrentHashMap的锁分段技术,仅适合JDK8以前的版本
2、我们很多时候推荐使用ConcurrentHashMap来代替HashMap应用于多线程的环境,很不巧的是ConcurrentHashMap也有可能会造成CPU 100%的异常现象。这个怪异现象存在于JDK8的ConcurrentHashMap中
什么情况下JDK8的ConcurrentHashMap会出现这个Bug呢?首先我们来运行一下这段代码:
在这里插入图片描述
你会惊奇的发现这个程序一直处于Running状态,我们通过top -Hp [pid]命令查看到其中一个线程的CPU使用率接近100%,参考下图:
ConcurrentHashMap也有可能会造成CPU 100%的异常现象_第1张图片
可以看到pid为31417的东东,我们再通过jstack -l [pid]命令查看到对应的线程为:
ConcurrentHashMap也有可能会造成CPU 100%的异常现象_第2张图片
注意将nid=0x7ab9的16进制转为10进制就是31417。可以看到问题是发生在了computeIfAbsent方法中,我们将示例中的程序换成下面这段程序也会同样出现CPU 100%的Bug:
ConcurrentHashMap也有可能会造成CPU 100%的异常现象_第3张图片
问题的关键在于递归使用了computeIfAbsent方法,笔者在stackoverflow上还搜索到了同类型的问题,下面的示例程序中调用fibonacci方法同样也会造成CPU 100%.
ConcurrentHashMap也有可能会造成CPU 100%的异常现象_第4张图片
3、jdk9已经修复ConcurrentHashMap可能会造成CPU 100%的问题
https://bugs.openjdk.java.net/browse/JDK-8062841

为什么会发生这个BUG,答案就在ConcurrentHashMap中的computeIfAbsent方法
怎么规避这个问题呢?
1、只要不在递归中使用computeIfAbsent方法就好啦
2、降级用可爱的分段锁,
3、升级JDK9(jdk9中已经得到修复)

你可能感兴趣的:(个人总结)