Race Condition(也叫做资源竞争),是多线程编程中比较头疼的问题。特别是Java多线程模型当中,经常会因为多个线程同时访问相同的共享数据,而造成数据的不一致性。为了解决这个问题,通常来说需要加上同步标志“synchronized”,来保证数据的串行访问。但是“synchronized”是个性能杀手,过多的使用会导致性能下降,特别是扩展性下降,使得你的系统不能使用多个CPU资源。

HashMap不是一个线程安全的数据结构,要用到多个线程中去,需要自己加上同步标志,为什么会死循环呢,看看下面HashMap中get函数的源代码:

public V get(Object key) {if (key == null)return getForNullKey();int hash = hash(key.hashCode());for (Entry<K,V> e = table[indexFor(hash, table.length)];e != null;e = e.next) {Object k;if (e.hash == hash && ((k = e.key) == key || key.equals(k)))return e.value;}return null;}

get函数会根据key的hashcode来锁定多个对象,并且遍历这些对象来找到key所对应的对象

当多个线程不安全的修改HanshMap数据结构的时候,有可能使得这个函数进入死循环。

我们建议客户使用ConcurrentHashMap或在使用HanshMap的时候加上同步标志

单步Debug是没问题,但代码在多线程情况下工作会出现线程安全。 Hashmap不是读写线程安全的,只有全部只读才是线程安全的,Hashmap在被并发读写使用的时候会出现线程安全问题,一般理解的线程安全问题导致的是数据错误。 而Hashmap多线程同时读写操作时,可能使程序挂起。

以下引用自http://sdh5724.javaeye.com/blog/619130

分析: 我们知道Hashmap在被并发读写使用的时候, 会抛出ConcurrentModificationException这个异常, 但是JDK文档明确指出, 这个异常抛出是属于 fail-fast 的一个设计方法, 目的是为了开发者能及早的意识到线程安全问题发生。 但是, 这个fail-fast不是一定会发生, 而是可能会发生的行为。 因此, 在一个不确定状态下的下,jvm线程发生持续100%cpu行为是比较容易理解了(for (Entry<K,V> e = table[i]; e != null; e = e.next), 目前只能估计是这个代码进入死循环的状态,还不能非常明确)。

“正确用法”

注意更改HashMap中的内容时是否存在同时并发线程读的情况,如果有, 需要对读写的入口做同步. 如果知道要在多线程情况下读写Map, 建议使用线程安全的ConcurrentHashMap实现代替HashMap。ConcurrentHashMap 可以在不损失线程安全的同时提供很好的并发性。

Race Condition 引起的 HashMap CPU100%相关推荐

  1. java race condition_java 多线程下race condition问题

    这个问题的讨论来自内部的一个关于"多线程环境下使用Hashmap的安全问题"的讨论,HashMap多线程的问题之前已经提过一次,见之前的blog.本篇文章主要讨论多线程下race ...

  2. java race condition_java多线程(一)Race Condition现象及产生的原因

    什么是Race Condition 首先,什么是Race Condition呢,Race Condition中文翻译是竞争条件,是指多个进程或者线程并发访问和操作同一数据且执行结果与访问发生的特定顺序 ...

  3. python 很高兴问题_Python 3.7曾有一个很老的GIL竞态条件(race condition),我是这么解决的...

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 作者:Victor Stinner 作为Python最关键的组成部分之一:GIL(全局解释器锁),我花了4 ...

  4. 什么是Race Condition?

    简介 race condition是多线程的应用程序中经常遇到的问题,本文章接下来会解释什么是race condition,如何检测到它们以及如何解决这类问题. Race condition 从定义来 ...

  5. 数据争用(data race) 和竞态条件(race condition)

    在有关多线程编程的话题中,数据争用(data race) 和竞态条件(race condition)是两个经常被提及的名词,它们两个有着相似的名字,也是我们在并行编程中极力避免出现的.但在处理实际问题 ...

  6. Race Condition漏洞

    Race Condition Race Condition(竞争条件)是一种情形,在该情形下系统或者程序的输出受其他不可控事件的顺序或事件的影响.软件中的Race Condition通常出现在两个并发 ...

  7. java race condition_Java中的Race condition和Critical section(译)

    Java中的Race condition和Critical section(译) race condition,即竞态,是一种可能发生于critical section中的特殊状态,critical ...

  8. Race condition

    在很多门课上都接触到race condition, 其中也举了很多方法解决这个问题.于是想来总结一下这些方法. Race condition 它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺 ...

  9. (转)Race condition解决

    在很多门课上都接触到race condition, 其中也举了很多方法解决这个问题.于是想来总结一下这些方法. Race condition 它旨在描述一个系统或者进程的输出依赖于不受控制的事件出现顺 ...

最新文章

  1. 写代码做副业月入33K+的方法都藏在这几个淘宝大佬的公众号里!
  2. 看完这篇文章之后,终于明白了编译到底怎么回事。
  3. eclipse安装插件的三种方法
  4. qotd服务_QOTD:Java线程与Java堆空间
  5. layou split 属性
  6. Windows7 + Nginx + Memcached + Tomcat 集群 session 共享
  7. 【李宏毅机器学习】Recurrent Neural Network Part1 循环神经网络(p20) 学习笔记
  8. UITableView的重用
  9. Android入门项目(校园软件)
  10. 打印机驱动是什么,打印机驱动有什么用,一定要安装打印机驱动吗
  11. matlabR2016a与solidworks2016联合仿真的经验分享
  12. 大数据分析师的报考条件是什么?
  13. 海洋大数据应用关键技术及应用前景
  14. 360云盘上传 计算机文件格式,360云盘怎么上传文件 360云盘上传文件方法
  15. [转载] COM 套间
  16. 计算机科学与技术补中益气丸的成分,经典名方,补中益气丸运用解析
  17. 别让职场形象毁了你的职场前程
  18. 网页上播放微信录音amr文件方案
  19. torch.logical_and()方法
  20. 渲染篇四:千方百计——Event Loop 与异步更新策略

热门文章

  1. 人生最靠谱的投资是什么?怎么投?
  2. React Native 0.59.x新特性解读
  3. LeetCode刷题——快慢指针
  4. Linux基本命令(完整版-详解)
  5. 无烟锅强制国标年内有望出台
  6. 了解房屋抵押贷款,助您实现幸福家庭梦
  7. 中国动物疫病诊断试剂行业研究与投资前景报告(2022版)
  8. mapreduce多目录输出(MultipleOutputFormat和MultipleOutputs)
  9. signature=b82cbfee4ef06278e49b74f8c0c0e8a0,FgfdhG0G4b58BB0Y
  10. 项目的开发流程(大公司)