HashMap是线程安全的吗?有什么线程安全的方法
总结
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是线程安全的吗?有什么线程安全的方法相关推荐
- HashMap 1.8 源码解析以及非线程安全分析
2019独角兽企业重金招聘Python工程师标准>>> 1.首先看下HashMap的put方法. final V putVal(int hash, K key, V value, b ...
- HashMap、HashTable、ConcurrentHashMap、HashSet区别 线程安全类
HashMap专题:HashMap的实现原理--链表散列 HashTable专题:Hashtable数据存储结构-遍历规则,Hash类型的复杂度为啥都是O(1)-源码分析 Hash,Tree数据结构时 ...
- hashmap为什么是线程不安全的_HashMap 为什么线程不安全?
1.jdk1.7中的HashMap 1.1 扩容造成死循环分析过程 1.2 扩容造成数据丢失分析过程 2.jdk1.8中HashMap 总结 前言:我们都知道HashMap是线程不安全的,在多线程环境 ...
- 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )
文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...
- java 线程安全list_JAVA并发编程实战-线程安全性
线程安全性: 对象的状态是指存储在状态变量(例如实例和静态域)中的数据. 对象的状态可能包括其他依赖对象的域. 例如:某个HashMap的状态不仅存储在HashMap对象本身,还存储在许多Map.En ...
- 【JUC】第二章 线程间通信、集合的线程安全
第二章 线程间通信.集合的线程安全 文章目录 第二章 线程间通信.集合的线程安全 一.线程间通信 1.介绍 2.synchronized 方案 3.Lock 方案 4.定制化线程通信 二.集合的线程安 ...
- InheritableThreadLocal——父线程传递本地变量到子线程的解决方式及分析
上一个博客提到ThreadLocal变量的基本使用方式,可以看出ThreadLocal是相对于每一个线程自己使用的本地变量,但是在实际的开发中,有这样的一种需求:父线程生成的变量需要传递到子线程中进行 ...
- java 线程面试题_50道Java线程面试题分析及答案
下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编 ...
- java 手编线程池_死磕 java线程系列之自己动手写一个线程池
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...
- C++:多线程中的小白(2)线程启动、结束、创建线程、join、detach
目录 一.范例演示:线程运行的开始和结束 二.其他创建线程的手法 一.范例演示:线程运行的开始和结束 (1)thrad (2)join()函数 (3)detach()函数 (4)joinable()函 ...
最新文章
- 看了眼大厂程序员的工资单,我酸了!
- python基础/编程语言,解释器和pycharm的安装
- hdu 5077 NAND(打表)2014 Asia regional 鞍山站 H题
- Python——OpenCV(opencv-python库)调用摄像头
- ArcGIS中实现将圆16等分
- 潜龙号开启水下机器人_国内首个智能绞吸机器人开展水下取土作业
- js金额格式化最简单方法 JS对货币格式化,js钱三位一隔,javascript货币格式化
- 数组排序:冒泡法和选择法
- 【Matlab】建立最优控制LQR控制器模型
- 计算机的应用主要遍布于,【应用】激光雕刻在各行业的应用
- OPENWRT,爱快等软路由推荐
- linux中oppenoffice的安装
- 【C语言学习】关于 int main(int argc,char* argv[])
- 基于 CentOS 7 配置 NIS 主从实现集中化认证
- 蓝桥杯 T32大臣的旅费
- HBase源码阅读(一) balancer
- 网线信道测试软件,测试网线是否正常的方法有哪些
- 数据挖掘算法——常用分类算法总结
- 掌握PPT制作高手的3大秘诀,从此熬夜加班是路人!
- 微信 不用手机号注册