HashMap在put的时候回调用下面的方法,这个方法是线程不安全的

void createEntry(int hash, K key, V value, int bucketIndex) {Entry<K,V> e = table[bucketIndex];table[bucketIndex] = new Entry<>(hash, key, value, e);size++;}

首先讲一下这个方法:

bucketIndex是该key所对应的数组的位置,table就是数组,Entry是链表的一个节点,因为里面有next属性,所以相当于一个链表,当一个新的元素put的时候,如果产生了hash碰撞,那么会把原来在该索引位置上的元素赋值给一个新的Entry 节点 e,然后创建一个新的 Entry 节点,并把 e 作为新节点的next,而且把这个新节点赋值给 table 的 bucketIndex 位置上,说白了就是把新节点放在链表的头节点,原来的头节点作为新头节点的next

所以这个方法存在线程安全性,当在高并发场景的时候,如果第一个线程和第二个线程同时执行了 Entry<K,V> e = table[bucketIndex]; 这一步的话,那么第二个线程的值会覆盖第一个线程的值,导致第一个线程的put被覆盖

引用其他文章:https://blog.csdn.net/eson_15/article/details/51543812

hashmap 线程不安全相关推荐

  1. Java集合:HashMap线程不安全?有哪些表现?

    HashMap是线程不安全的!主要表现在多线程情况下: 1)hash冲突时,put方法不是同步的,先存的值会被后存的值覆盖.(1.7和1.8都有的表现) 2)在resize的时候,可能会导致死循环(环 ...

  2. 谈谈HashMap线程不安全的体现

    转载自 谈谈HashMap线程不安全的体现 HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了. 那么,为什么说HashMap是线程不安全的呢?它在多线程环境 ...

  3. 为什么HashMap线程不安全?以及实现HashMap线程安全的解决方案

    一.为什么HashMap线程不安全? 原著参考 1.JDK1.7 扩容引发的死循环和数据丢失 (1).当前jdk1.7版本的HashMap线程不安全主要是发生在扩容函数中,其中调用了HshMap的tr ...

  4. HashMap线程安全问题详细解析

    1.简介 HashMap是一种非线程安全的数据结构,即在多线程环境下,无法保证其操作的原子性和一致性.在多个线程同时访问HashMap并进行修改操作时,可能会导致数据的不一致性和线程竞争条件的出现. ...

  5. 为什么HashMap线程不安全

    一.Map概述 我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的.因为它可以满足我们大多数的场景了. Map类继承图 上面展示了java中Map的继承 ...

  6. HashMap 线程安全问题

    前言 我们紧接着上节ArrayList 线程安全问题讲下HashMap的线程安全问题. 之前看书,书中经常会提及.HashTable是线程安全的,HashMap是线程非安全的.在多线程的情况下, Ha ...

  7. HashMap线程安全问题以及处理方法!

    一:HashMap为什么会有线程安全问题? 我们知道jdk1.7和jdk1.8中HashMap都是线程不安全的,那就具体讲一下为什么会线程不安全(两个方面). ①调用put方法 假如有两个线程A和B, ...

  8. 【Java】HashMap线程安全问题

    一.线程不安全的原因 jdk1.7和jdk1.8中HashMap都是线程不安全的,那就具体讲一下为什么会线程不安全(两个方面). (1)调用put方法 假如有两个线程A和B,A希望插入一个key-va ...

  9. HashMap线程不安全的原因和解决方案

    1.HashMap线程不安全原因: JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap#putVal(),具体原因:假设两个线程A.B都在进行put操作,并且hash函数 ...

  10. hashmap为什么线程不安全_面试官:你说 HashMap 线程不安全,它为啥不安全呢?...

    扫描下方海报 试读 本文来源: http://cnblogs.com/developer_chan/p/10450908.html 我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但 ...

最新文章

  1. CentOS全局配置JAVA环境变量,实现多个tomcat共用环境变量,不用再一个个tomcat配置
  2. 网络分布式软件bonic清除
  3. ecshop将编辑器更换为kindeditor
  4. JFrame windowbuiler的使用基础
  5. delphi 调用php接口_贝壳找房小程序从PHP到Golang的跃迁之路
  6. plsql tables 没有表_InnoDB 层锁、事务、统计信息字典表 | 全方位认识 information_schema...
  7. 自定义控件的构建(12)
  8. 第 6-5 课:MyBatis 核心和面试题(下)
  9. 王自如、罗永浩将一起出镜直播带货?罗永浩亲自回应
  10. 每天固定往一个银行卡存入100元,5年之后会有多大变化?有人能坚持吗?
  11. 学籍管理系统mysql实训报告_学生学籍管理系统数据库设计
  12. JQuery22( JQ原理 Clone)
  13. java发送邮件-java工具类
  14. 三种免费批量下载QQ空间相册方法-2018.05.20亲测有效
  15. 产品初探(一):面试经验记录
  16. 微信小程序提取汉字字母大写
  17. SUBSTR()函数详解
  18. 整数反转----秦九昭算法
  19. UA PHYS515 电磁理论II 静电场问题1 对称性与Image Charge Method
  20. 三方app跳转APN设置提示“此用户无权修改接入点名称设置”解决方案

热门文章

  1. vue中使用echarts
  2. Aspose.Words.dll根据模板生成word详解
  3. ROS Learning-008 beginner_Tutorials ROS话题
  4. UVA 12161 Ironman Race in Treeland (树分治)
  5. [复习]Python基础回顾
  6. 内存管理之直接内存管理
  7. 关于强连通图和欧拉图的一些粗浅理解
  8. 新增加的HTTP状态码 -- 103
  9. Swing中 paint()与paintComponent()的区别
  10. swift中的category,扩展