我们在使用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.