HashMap死循环造成CPU100%
我们在使用HashMap时,产生了死循环,本文对其进行分析,此问题仅在JDK1.7及之前存在!
实例代码
实例代码如下,我们模拟两个线程同时操作HashMap
package com.yang.concurrent;
import java.util.HashMap;
/**
* 本实例演示HashMap的死循环
*/
public class HashMapLoop {
private static HashMap<Integer,String> map=new HashMap<Integer, String>(2,1.5f);
public static void main(String[] args) {
map.put(5,"C");
map.put(7,"B");
map.put(3,"A");
new Thread(new Runnable() {
@Override
public void run() {
map.put(15,"D");
System.out.println(map);
}
},"thread1").start();
new Thread(new Runnable() {
@Override
public void run() {
map.put(1,"E");
System.out.println(map);
}
},"thread1").start();
}
}
调试方法
我们使用idea线程调试的方式,在HashMap的 transfer 方法的以下两个位置打断点。见下图:

将断点打到线程上,如下图所示:

当main 线程进入时直接放行,第一个子线程进入到第一个断点时,我们给运行到第二个断点上;同时切换第二个线程,让其也运行到第二个断点上。待都运行到第二个断点上是,进行运行,运行结果截图如下:

总结
此问题是由于使用HashMap在线程不安全的情况下导致的,和JDK没关系,此情况不应该使用HashMap,应该去使用并发容器的Map,例如:ConcurrentHashMap.

浙公网安备 33010602011771号