`
fredlong
  • 浏览: 135011 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HashMap的线程不安全特性导致死循环

 
阅读更多

在我们的理解中,线程不安全可能带来的问题是对一个对象的多写带来的数据不一致,可是万万没想到,由于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线程不安全的原因主要在于以下几个方面: 1. 多线程环境下并发修改:在多线程环境下,如果多个线程同时对HashMap进行读写操作,可能会导致数据的不一致性和数据丢失。例如,当一个线程正在执行put操作时,另...

    hashmap-thread-test:测试 Java HashMap 是否是线程安全的

    然而,`HashMap`并非线程安全,这意味着在多线程环境中直接使用`HashMap`可能会导致数据不一致、并发问题,甚至程序崩溃。本项目“hashmap-thread-test”显然是为了测试和展示这一特性。 ### Java HashMap 的特性 ...

    jdk中线程安全的集合类.docx

    ##### 2.1 为什么HashMap在多线程下不安全? `HashMap`之所以在多线程环境下出现问题,主要源于其内部实现机制。在`HashMap`中,数据是以键值对的形式存储在一个数组中,每个键值对对应一个链表或红黑树的节点。当...

    HashMap资料.zip

    线程安全问题可能导致数据不一致或者死循环等问题。 5. **null键和值**:HashMap允许键和值为null,但只能有一个键为null,因为所有null键的哈希值都为0,所有值为null的键都会被存放在数组的第0个槽位。 6. **...

    第9讲 对比Hashtable、HashMap、TreeMap有什么不同?1

    在并发环境下,HashMap的非线程安全可能导致死循环(例如,多个线程同时进行扩容操作)和其他并发问题。 了解Map的整体结构也很重要,HashMap和其他Map实现如LinkedHashMap(保持插入顺序或访问顺序的HashMap)都是...

    java7-8中的 HashMap和ConcurrentHashMap全解析

    `HashMap`是非线程安全的,意味着在多线程环境下,多个线程同时操作`HashMap`可能会导致数据不一致或者死循环。因此,如果需要在并发环境中使用,必须使用同步机制,如`synchronized`关键字或`Collections....

    求职宝典-Java 基础面试题

    在多线程环境下,HashMap的并发操作可能导致死循环问题。在JDK1.7中,rehash过程中的并发修改可能导致链表循环,而在JDK1.8中,虽然采用了红黑树,但仍然存在类似问题。为了解决这个问题,应使用ConcurrentHashMap,...

    面试题之详解HashMap

    2. HashMap多线程操作导致死循环问题 在并发环境下,多个线程同时对HashMap进行put和resize操作可能导致元素形成循环链表。在JDK 1.7中,resize过程中使用了头插法,这在并发时可能使链表反转,导致get操作陷入死...

    java,多线程实验.zip

    Java并发包提供了线程安全的集合类,如ArrayList的并发版本Vector,HashMap的并发版本ConcurrentHashMap等。 总结,Java多线程实验涉及的内容广泛,包括线程的创建与管理、同步与通信、线程池的使用、线程调度策略...

    JAVA+面试题+常用的比较齐全

    8. HashMap线程不安全体现在并发操作时可能出现数据丢失或死循环。JDK1.7的头部插入可能导致死循环,而JDK1.8改为了尾部插入以解决此问题。 9. 加载因子设置为0.75是考虑到容量与性能的平衡,太小可能导致频繁扩容...

    并发编程之一 日常学习笔记

    在并发编程中,不合适的并发操作HashMap可能导致数据不一致或者死循环。了解HashMap的内部实现有助于开发者理解为什么需要使用ConcurrentHashMap这样的线程安全数据结构,以及如何在多线程环境中正确使用HashMap。 ...

    BTA 常问的 Java基础39道常见面试题及详细答案.docx

    当多个线程同时修改HashMap时,可能导致死循环,因此在多线程环境下应使用ConcurrentHashMap或同步访问HashMap。 17. **集合包结构与Collections的区别**: - Collection是所有集合类的顶级接口,包括List、Set等...

    java面试大全

    不过需要注意的是,在多线程环境下,rehash操作可能会引起条件竞争问题,从而导致性能下降或者死循环问题。 关于Java集合类,容器类库主要分为Collection和Map两大类。Collection下又分为List和Set两大接口。List...

    面试题 Java 基础总结了经常会被面试官问的问题

    - **死循环问题**:HashMap在并发环境下修改可能导致迭代失败,需使用ConcurrentHashMap。 - **HashMap put流程**:插入新键值对,考虑扩容、冲突解决等。 10. **其他知识点**: - **Integer缓存池**:-128到127...

    2018年最全Java面试通关秘籍第四套.docx

    - **多线程下的集合问题**:如HashMap在多线程环境下可能导致死循环和Hash DOS攻击,应使用ConcurrentHashMap保证线程安全。 3. **并发编程** - **线程和进程**:线程是程序的执行流,进程是资源分配单位。 - **...

    面试军火库-花琪尧.pdf

    * StringBuilder:StringBuilder 的底层为字符数组,其进行字符串拼接的是先将字符串转换为数组,然后直接在原来的数组中添加元素,所以其特点是可变,效率相较于 String 高,其是线程不安全的。 * StringBuffer:...

    一线互联网大厂完整Java面试题.pdf

    1. HashMap是非线程安全的,如果在多线程环境下使用,可能会导致数据不一致或者死循环。 2. ConcurrentHashMap的实现原理是通过分段锁技术,在保证线程安全的同时提高并发访问效率。 3. ThreadLocal提供了一种线程...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    多线程put后可能导致get死循环 67 多线程put的时候可能导致元素丢失 68 解决方案 68 【集合】ConcurrentHashMap的get(),put(),又是如何实现的?ConcurrentHashMap有哪些问题?ConcurrentHashMap的锁是读锁还是写锁...

    阿里巴巴 面经

    - **线程安全**:`HashTable`的所有方法都是同步的,而`HashMap`不是。 - **null值支持**:`HashMap`允许键和值为null,而`HashTable`不允许。 - **性能**:`HashMap`通常比`HashTable`性能更高。 **16. HashTable...

Global site tag (gtag.js) - Google Analytics