几种线程安全的Map解析
HashMap线程安全的吗?
Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的。
看下面两个场景:
1、当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不安全的问题了。
2、当用在单例对象成员变量的时候呢?这时候多个线程过来访问的就是同一个HashMap了,对同个HashMap操作这时候就存在线程安全的问题了。
1、HashTable
private Map<String, Object> map = new Hashtable<>();
来看看HashTable的源码
HashTable的get/put方法都被synchronized关键字修饰,说明它们是方法级别阻塞的,它们占用共享资源锁,所以导致同时只能一个线程操作get或者put,而且get/put操作不能同时执行,所以这种同步的集合效率非常低,一般不建议使用这个集合。
2、SynchronizedMap
private Map<String, Object> map = Collections.synchronizedMap(new HashMap<String, Object>());
这种是直接使用工具类里面的方法创建SynchronizedMap,把传入进行的HashMap对象进行了包装同步而已,来看看它的源码。
这个同步方式实现也比较简单,看出SynchronizedMap的实现方式是加了个对象锁,每次对HashMap的操作都要先获取这个mutex的对象锁才能进入,所以性能也不会比HashTable好到哪里去,也不建议使用。
3、ConcurrentHashMap - 推荐
private Map<String, Object> map = new ConcurrentHashMap<>();
这个也是最推荐使用的线程安全的Map,也是实现方式最复杂的一个集合,每个版本的实现方式也不一样,在jdk8之前是使用分段加锁的一个方式,分成16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。
虽然实现起来很复杂,但使用起来也是非常简单的,在java面试中问的频率也非常高,最重要的是性能要比上面两种同步方式要快太多,推荐使用。
几种线程安全的Map解析相关推荐
- 怎样实现两个线程共享一个集合_面试高频考察点:几种线程安全的Map解析
Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不 ...
- 线程安全的map_面试必问-几种线程安全的Map解析
HashMap线程安全的吗? Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 推荐阅读:我凭借这份pdf拿下了蚂蚁金服.字节跳动.小米等大厂的offer 看下面两个场景: ...
- 几种线程安全的Map解析,冲刺7天拿下Offer!
4 年经验应该具备哪些技能 首先,简单的聊一下我认为的 4 年经验左右.优秀的 Java 程序员应该具备的技能有哪些,按"专业技能"和"项目"两块,包括但不限于 ...
- 几种线程安全的Map解析,真香系列
1.笔试常见的问题? 面试常见的问题上面给的面试题链接基本都有.我只提几点: 写SQL:写SQL很常考察group by.内连接和外连接. 手写代码:手写代码一般考单例.排序.线程.消费者生产者.我建 ...
- 几种线程安全的Map
Java中平时用的最多的map就是hashmap但是它却是线程不安全的. 那除了hashmap还有哪些常见的线程安全的map? 1.hashtable Map<String,Object> ...
- 多线程之 几种线程安全的Map及效率比较
Java中平时用的最多的map就是hashmap但是它却是线程不安全的. 那除了hashmap还有哪些常见的线程安全的map?,今天我们就聊聊他们为什么是安全的 并用多线程读写1百条数据来验证他们的效 ...
- golang实现线程安全的map
转载自:https://halfrost.com/go_map_chapter_one/ https://halfrost.com/go_map_chapter_two/ Map 是一种很常见的数据结 ...
- golang 线程安全的map
golang中的map是一种hashmap ,同时也是线程不安全的,并发读写时会发生panic go语言在sync包中提供了一种线程安全的map,他的数据结构如下 type Map struct {m ...
- JAVA线程安全Map解析
JAVA线程安全Map解析 HashTable 结构 线程安全的实现 Collections.synchronizedMap 线程安全的实现 ConcurrentHashMap 线程安全的实现 Con ...
最新文章
- 2018-3-7论文网络评论中非结构化信息的表示与研究--------实验分析
- MSICE界面和功能分析
- java 缓存的简单实现_Java8简单的本地缓存实现
- MySQL分组函数的使用特点
- JAVA ReentrantLock 分析
- 在 k8s 中部署 Prometheus 和 Grafana
- Codeforces Round #673 (Div. 2)——待补 E
- 游戏详细设计说明书_宜家的说明书设计脑洞太大了!
- python如何确定拐点_python – 在样条拟合1d数据中找到拐点
- 支持60+数据传输链路,华为云DRS链路商用大盘点
- 一步步实现SDDC-分布式交换机入门
- 搭建Zabbix Proxy HA
- linux终端<Terminal>使用ping
- java代码内创建mysql索引_点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)...
- 强大的端到端语音识别框架—RNN-T
- QT应用SQL数据库,简单全面的应用,增删改查。
- php++redius,【答疑】edius中快进播放的快捷键是什么啊? - 羽兔网问答
- Unity 安卓打包
- linux mysql max_allowed_packet_Linux服务器上如何设置MySQL的max_allowed_packe
- 基于MFC和OpenCV的图像处理小软件