在我们的理解中,线程不安全可能带来的问题是对一个对象的多写带来的数据不一致,可是万万没想到,由于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线程不安全的原因主要在于以下几个方面: 1. 多线程环境下并发修改:在多线程环境下,如果多个线程同时对HashMap进行读写操作,可能会导致数据的不一致性和数据丢失。例如,当一个线程正在执行put操作时,另...
然而,`HashMap`并非线程安全,这意味着在多线程环境中直接使用`HashMap`可能会导致数据不一致、并发问题,甚至程序崩溃。本项目“hashmap-thread-test”显然是为了测试和展示这一特性。 ### Java HashMap 的特性 ...
##### 2.1 为什么HashMap在多线程下不安全? `HashMap`之所以在多线程环境下出现问题,主要源于其内部实现机制。在`HashMap`中,数据是以键值对的形式存储在一个数组中,每个键值对对应一个链表或红黑树的节点。当...
线程安全问题可能导致数据不一致或者死循环等问题。 5. **null键和值**:HashMap允许键和值为null,但只能有一个键为null,因为所有null键的哈希值都为0,所有值为null的键都会被存放在数组的第0个槽位。 6. **...
在并发环境下,HashMap的非线程安全可能导致死循环(例如,多个线程同时进行扩容操作)和其他并发问题。 了解Map的整体结构也很重要,HashMap和其他Map实现如LinkedHashMap(保持插入顺序或访问顺序的HashMap)都是...
`HashMap`是非线程安全的,意味着在多线程环境下,多个线程同时操作`HashMap`可能会导致数据不一致或者死循环。因此,如果需要在并发环境中使用,必须使用同步机制,如`synchronized`关键字或`Collections....
在多线程环境下,HashMap的并发操作可能导致死循环问题。在JDK1.7中,rehash过程中的并发修改可能导致链表循环,而在JDK1.8中,虽然采用了红黑树,但仍然存在类似问题。为了解决这个问题,应使用ConcurrentHashMap,...
2. HashMap多线程操作导致死循环问题 在并发环境下,多个线程同时对HashMap进行put和resize操作可能导致元素形成循环链表。在JDK 1.7中,resize过程中使用了头插法,这在并发时可能使链表反转,导致get操作陷入死...
Java并发包提供了线程安全的集合类,如ArrayList的并发版本Vector,HashMap的并发版本ConcurrentHashMap等。 总结,Java多线程实验涉及的内容广泛,包括线程的创建与管理、同步与通信、线程池的使用、线程调度策略...
8. HashMap线程不安全体现在并发操作时可能出现数据丢失或死循环。JDK1.7的头部插入可能导致死循环,而JDK1.8改为了尾部插入以解决此问题。 9. 加载因子设置为0.75是考虑到容量与性能的平衡,太小可能导致频繁扩容...
在并发编程中,不合适的并发操作HashMap可能导致数据不一致或者死循环。了解HashMap的内部实现有助于开发者理解为什么需要使用ConcurrentHashMap这样的线程安全数据结构,以及如何在多线程环境中正确使用HashMap。 ...
当多个线程同时修改HashMap时,可能导致死循环,因此在多线程环境下应使用ConcurrentHashMap或同步访问HashMap。 17. **集合包结构与Collections的区别**: - Collection是所有集合类的顶级接口,包括List、Set等...
不过需要注意的是,在多线程环境下,rehash操作可能会引起条件竞争问题,从而导致性能下降或者死循环问题。 关于Java集合类,容器类库主要分为Collection和Map两大类。Collection下又分为List和Set两大接口。List...
- **死循环问题**:HashMap在并发环境下修改可能导致迭代失败,需使用ConcurrentHashMap。 - **HashMap put流程**:插入新键值对,考虑扩容、冲突解决等。 10. **其他知识点**: - **Integer缓存池**:-128到127...
- **多线程下的集合问题**:如HashMap在多线程环境下可能导致死循环和Hash DOS攻击,应使用ConcurrentHashMap保证线程安全。 3. **并发编程** - **线程和进程**:线程是程序的执行流,进程是资源分配单位。 - **...
* StringBuilder:StringBuilder 的底层为字符数组,其进行字符串拼接的是先将字符串转换为数组,然后直接在原来的数组中添加元素,所以其特点是可变,效率相较于 String 高,其是线程不安全的。 * StringBuffer:...
1. HashMap是非线程安全的,如果在多线程环境下使用,可能会导致数据不一致或者死循环。 2. ConcurrentHashMap的实现原理是通过分段锁技术,在保证线程安全的同时提高并发访问效率。 3. ThreadLocal提供了一种线程...
多线程put后可能导致get死循环 67 多线程put的时候可能导致元素丢失 68 解决方案 68 【集合】ConcurrentHashMap的get(),put(),又是如何实现的?ConcurrentHashMap有哪些问题?ConcurrentHashMap的锁是读锁还是写锁...
- **线程安全**:`HashTable`的所有方法都是同步的,而`HashMap`不是。 - **null值支持**:`HashMap`允许键和值为null,而`HashTable`不允许。 - **性能**:`HashMap`通常比`HashTable`性能更高。 **16. HashTable...