总结
HashMap在并发场景中不是线程安全的。比如A希望插入一个key-value对到HashMap中,当获取到对应的链表结点位置时,此时线程A的时间片用完了,而此时线程B被调度得以执行,可能线程B占用了A计算得到的位置,插入了数值。而线程A被切换回来的时候,不知道B已经插入了元素,仍然将元素插入此前计算好的位置,这样就会将B线程的插入记录覆盖掉了,这对应了多线程的put可能导致元素的丢失;

JDK1.7 当扩容的时候,存在 Entry 链死循环和数据丢失问题(线程1的put和线程2的get并发,可能导致get为null)
JDK 1.8 HashMap 采用数组 + 链表 + 红黑二叉树的数据结构,优化了 1.7 中数组扩容的方案,解决了 Entry 链死循环和数据丢失问题。但是多线程背景下,put 方法存在数据覆盖的问题。
有什么线程安全的方法

  • HashTable 是线程安全的。HashTable 容器使用 synchronized 来保证线程安全,但在线程竞争激烈的情况下 HashTable 的效率非常低下.

  • 使用ConcurrentHashMap ,分段锁的思想,将 HashMap 进行切割,把 HashMap 中的哈希数组切分成小数组,每个小数组有 n 个 HashEntry 组成,其中小数组继承自ReentrantLock(可重入锁),这个小数组名叫Segment(JDK1.7)

    JDK1.8中取消了Segment 分段锁,采用 CAS + synchronized 来保证并发安全,ConcurrentHashMap 中 synchronized 只锁定当前链表或红黑二叉树的首节点,只要节点 hash 不冲突,就不会产生并发

  • 使用Collections.synchronizedMap方法,对方法进行加同步锁;

HashMap是线程安全的吗?有什么线程安全的方法相关推荐

  1. HashMap 1.8 源码解析以及非线程安全分析

    2019独角兽企业重金招聘Python工程师标准>>> 1.首先看下HashMap的put方法. final V putVal(int hash, K key, V value, b ...

  2. HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类

    HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...

  3. hashmap为什么是线程不安全的_HashMap 为什么线程不安全?

    1.jdk1.7中的HashMap 1.1 扩容造成死循环分析过程 1.2 扩容造成数据丢失分析过程 2.jdk1.8中HashMap 总结 前言:我们都知道HashMap是线程不安全的,在多线程环境 ...

  4. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

    文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...

  5. java 线程安全list_JAVA并发编程实战-线程安全性

    线程安全性: 对象的状态是指存储在状态变量(例如实例和静态域)中的数据. 对象的状态可能包括其他依赖对象的域. 例如:某个HashMap的状态不仅存储在HashMap对象本身,还存储在许多Map.En ...

  6. 【JUC】第二章 线程间通信、集合的线程安全

    第二章 线程间通信.集合的线程安全 文章目录 第二章 线程间通信.集合的线程安全 一.线程间通信 1.介绍 2.synchronized 方案 3.Lock 方案 4.定制化线程通信 二.集合的线程安 ...

  7. InheritableThreadLocal——父线程传递本地变量到子线程的解决方式及分析

    上一个博客提到ThreadLocal变量的基本使用方式,可以看出ThreadLocal是相对于每一个线程自己使用的本地变量,但是在实际的开发中,有这样的一种需求:父线程生成的变量需要传递到子线程中进行 ...

  8. java 线程面试题_50道Java线程面试题分析及答案

    下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编 ...

  9. java 手编线程池_死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  10. C++:多线程中的小白(2)线程启动、结束、创建线程、join、detach

    目录 一.范例演示:线程运行的开始和结束 二.其他创建线程的手法 一.范例演示:线程运行的开始和结束 (1)thrad (2)join()函数 (3)detach()函数 (4)joinable()函 ...

最新文章

  1. 看了眼大厂程序员的工资单,我酸了!
  2. python基础/编程语言,解释器和pycharm的安装
  3. hdu 5077 NAND(打表)2014 Asia regional 鞍山站 H题
  4. Python——OpenCV(opencv-python库)调用摄像头
  5. ArcGIS中实现将圆16等分
  6. 潜龙号开启水下机器人_国内首个智能绞吸机器人开展水下取土作业
  7. js金额格式化最简单方法 JS对货币格式化,js钱三位一隔,javascript货币格式化
  8. 数组排序:冒泡法和选择法
  9. 【Matlab】建立最优控制LQR控制器模型
  10. 计算机的应用主要遍布于,【应用】激光雕刻在各行业的应用
  11. OPENWRT,爱快等软路由推荐
  12. linux中oppenoffice的安装
  13. 【C语言学习】关于 int main(int argc,char* argv[])
  14. 基于 CentOS 7 配置 NIS 主从实现集中化认证
  15. 蓝桥杯 T32大臣的旅费
  16. HBase源码阅读(一) balancer
  17. 网线信道测试软件,测试网线是否正常的方法有哪些
  18. 数据挖掘算法——常用分类算法总结
  19. 掌握PPT制作高手的3大秘诀,从此熬夜加班是路人!
  20. 微信 不用手机号注册

热门文章

  1. 项目ERP与传统ERP的区别是什么?
  2. vue组件库介绍以及组件库Element UI 的使用
  3. Quick Reference 代码速查表
  4. QT——开发入门简介
  5. 将私人对话发布到公共空间来寻求正义是否可取
  6. 串联谐振耐压试验装置技术参数和特点,如何选择
  7. 【数据结构】二叉树 (Binary Tree)
  8. 欧拉角与万向节死锁(Euler angle Gimbal Lock)
  9. python文件写入后,但文件还是空白
  10. 【模型部署】NNI:剪枝和量化