在我们的理解中,线程不安全可能带来的问题是对一个对象的多写带来的数据不一致,可是万万没想到,由于HashMap的线程不安全特性,居然会出现CPU100%的情况。
最近我们生产环境就出现了这种情况,夜间的业务量并不大,一台机器的某个服务占用CUP飙升到了340%,于是我们切断了这台机器的业务,在没有业务的情况,这个服务的CPU占用仍然没有降下来。
抓了个dump,看看了线程栈的运行情况,发现这个服务的三个线程都在干同一件事,这个很诡异:
"qtp1660201379-122235" prio=5 tid=122235 RUNNABLE at java.util.HashMap.getEntry(HashMap.java:465) Local Variable: java.util.HashMap$Entry#77179 Local Variable: java.lang.String#6513 at java.util.HashMap.get(HashMap.java:417) ......
应该是这三个线程都在跑一个死循环,然后每个线程占用一颗CPU,正好把300%的CPU给占用了。查了下,由于HashMap的线程不安全特性,会在多线程对同一个HashMap做同一个操作的时候小概率引起死循环。
具体就是很多线程在对同一个HashMap进行读操作的时候,一个线程对这个对象在没有锁保护地进行写操作的时候,就会小概率引起死循环。
JAVA团队认为HashMap被标为线程不安全,在多线程情况下,出现这种问题属于正常,不算bug。
然后推荐大家在多线程环境下使用ConcurrentHashmap来替换HashMap。
具体死循环的原因分析见此文章:
http://coolshell.cn/articles/9606.html
相关推荐
HashMap为什么是线程不安全的?如何解决HashMap的线程不安全问题?
高级程序员必会的HashMap的线程安全问题,适用于0~2年的
3.为什么hashmap不安全 why 3.1 插入HashMap.put 3.1.1 HashMap 在扩容的时候 3.2 HashMap 在删除数据的时候 0.背景 经常会看到说HashMap是线程不安全的,ConcurrentHashMap是线程安全的等等说法,不禁有个疑问,...
NULL 博文链接:https://flyfoxs.iteye.com/blog/1198030
HashMap死循环原因分析.docx
详 解 hashmap 1.7 扩 容 机 制 的 数 据 迁 移 以 及 出 现 环 形 列 表 导 致 死 锁 情 况 视 频
以结构图记录自己的记录自己面对的感触
哈希映射线程测试使用 Maven 构建和运行 mvn exec:java
疫苗:Java HashMap的死循环
这就有可能导致A线程和B线程同时对一个数组扩容,A线程扩容后替换掉老数组,这时B线程使用的数组实际上是A线程扩容后的数组,就会产生线程安全问题。 死锁原因 比如,当前集合数组长度为2,已经有两个元素被放在了...
线程安全与不安全集合 线程不安全集合: ArrayList LinkedList HashMap HashSet TreeMap TreeSet StringBulider 线程安全集合: Vector HashTable Properties 集合线程安全与解决方案 ArrayList...
非线程安全:如果多个线程同时访问同一个HashMap实例,可能会导致数据不一致的问题。因此,在使用HashMap时需要进行同步处理或者使用线程安全的HashMap实现类。 动态扩容:当HashMap中的元素数量超过了容量(默认为...
HashMap和HashTable的区别?但是如果想线程安全有想效率高?
Golang无锁线程安全的HashMap,为最快的读取访问进行了优化
Java标准库中的一些类如ArrayList、HashMap和SimpleDateFormat,都是非线程安全的,在多线程环境下直接使用它们可能导致一些非预期的结果,甚至是一些灾难性的结果。一般来说,Java标准库中的类在其API文档中会说明...
HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx
HashMap导致CPU100% 的分析
HashMap 不是线程安全的;多线程环境下,建议使用 ConcurrentHashMap,或者使用 Collections.synchronizedMap(hashMap) 将 HashMap 转成线程同步的。 只能使用关联的键来获取值。 HashMap 只能存储对象,所以基本...
HASHMAP基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)下面小编来带大家详细了解下吧
HashMap在多线程的环境下是不安全的,没有进行加锁措施,所以执行效率快。如果我么需要有一个线程安全的HashMap,可以使用Collections.synchronizedMap(Map m)方法获得线程安全的HashMap,也可以使用...