zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    关于display:flex
    关于兼容性——百分比对于IE浏览器的影响
    谈谈一个菜鸟写了一段时间的静态页面
    2016.01.02
    课时21:函数:lambda表达式
    课时20:内嵌函数和闭包
    课时19:函数:我的地盘听我的
    课时18:函数:灵活即强大
    课时17:函数:Python的乐高积木
    课时16:序列
  • 原文地址:https://www.cnblogs.com/cnxieyang/p/12765321.html
Copyright © 2011-2022 走看看