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.

原文地址:https://www.cnblogs.com/cnxieyang/p/12765321.html