hashmap 线程不安全
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 线程不安全相关推荐
- Java集合:HashMap线程不安全?有哪些表现?
HashMap是线程不安全的!主要表现在多线程情况下: 1)hash冲突时,put方法不是同步的,先存的值会被后存的值覆盖.(1.7和1.8都有的表现) 2)在resize的时候,可能会导致死循环(环 ...
- 谈谈HashMap线程不安全的体现
转载自 谈谈HashMap线程不安全的体现 HashMap的原理以及如何实现,之前在JDK7与JDK8中HashMap的实现中已经说明了. 那么,为什么说HashMap是线程不安全的呢?它在多线程环境 ...
- 为什么HashMap线程不安全?以及实现HashMap线程安全的解决方案
一.为什么HashMap线程不安全? 原著参考 1.JDK1.7 扩容引发的死循环和数据丢失 (1).当前jdk1.7版本的HashMap线程不安全主要是发生在扩容函数中,其中调用了HshMap的tr ...
- HashMap线程安全问题详细解析
1.简介 HashMap是一种非线程安全的数据结构,即在多线程环境下,无法保证其操作的原子性和一致性.在多个线程同时访问HashMap并进行修改操作时,可能会导致数据的不一致性和线程竞争条件的出现. ...
- 为什么HashMap线程不安全
一.Map概述 我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的.因为它可以满足我们大多数的场景了. Map类继承图 上面展示了java中Map的继承 ...
- HashMap 线程安全问题
前言 我们紧接着上节ArrayList 线程安全问题讲下HashMap的线程安全问题. 之前看书,书中经常会提及.HashTable是线程安全的,HashMap是线程非安全的.在多线程的情况下, Ha ...
- HashMap线程安全问题以及处理方法!
一:HashMap为什么会有线程安全问题? 我们知道jdk1.7和jdk1.8中HashMap都是线程不安全的,那就具体讲一下为什么会线程不安全(两个方面). ①调用put方法 假如有两个线程A和B, ...
- 【Java】HashMap线程安全问题
一.线程不安全的原因 jdk1.7和jdk1.8中HashMap都是线程不安全的,那就具体讲一下为什么会线程不安全(两个方面). (1)调用put方法 假如有两个线程A和B,A希望插入一个key-va ...
- HashMap线程不安全的原因和解决方案
1.HashMap线程不安全原因: JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap#putVal(),具体原因:假设两个线程A.B都在进行put操作,并且hash函数 ...
- hashmap为什么线程不安全_面试官:你说 HashMap 线程不安全,它为啥不安全呢?...
扫描下方海报 试读 本文来源: http://cnblogs.com/developer_chan/p/10450908.html 我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但 ...
最新文章
- CentOS全局配置JAVA环境变量,实现多个tomcat共用环境变量,不用再一个个tomcat配置
- 网络分布式软件bonic清除
- ecshop将编辑器更换为kindeditor
- JFrame windowbuiler的使用基础
- delphi 调用php接口_贝壳找房小程序从PHP到Golang的跃迁之路
- plsql tables 没有表_InnoDB 层锁、事务、统计信息字典表 | 全方位认识 information_schema...
- 自定义控件的构建(12)
- 第 6-5 课:MyBatis 核心和面试题(下)
- 王自如、罗永浩将一起出镜直播带货?罗永浩亲自回应
- 每天固定往一个银行卡存入100元,5年之后会有多大变化?有人能坚持吗?
- 学籍管理系统mysql实训报告_学生学籍管理系统数据库设计
- JQuery22( JQ原理 Clone)
- java发送邮件-java工具类
- 三种免费批量下载QQ空间相册方法-2018.05.20亲测有效
- 产品初探(一):面试经验记录
- 微信小程序提取汉字字母大写
- SUBSTR()函数详解
- 整数反转----秦九昭算法
- UA PHYS515 电磁理论II 静电场问题1 对称性与Image Charge Method
- 三方app跳转APN设置提示“此用户无权修改接入点名称设置”解决方案
热门文章
- vue中使用echarts
- Aspose.Words.dll根据模板生成word详解
- ROS Learning-008 beginner_Tutorials ROS话题
- UVA 12161 Ironman Race in Treeland (树分治)
- [复习]Python基础回顾
- 内存管理之直接内存管理
- 关于强连通图和欧拉图的一些粗浅理解
- 新增加的HTTP状态码 -- 103
- Swing中 paint()与paintComponent()的区别
- swift中的category,扩展