Java中平时用的最多的map就是hashmap但是它却是线程不安全的。
那除了hashmap还有哪些常见的线程安全的map?
1.hashtable
Map<String,Object> hashtable=new Hashtable<String,Object>();

这是所有人最先想到的,那为什么它是线程安全的?那就看看它的源码,我们可以看出我们常用的put,get,containsKey等方法都是同步的,所以它是线程安全的

public synchronized boolean containsKey(Object key) {Entry<?,?> tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {if ((e.hash == hash) && e.key.equals(key)) {return true;}}return false;}public synchronized V get(Object key) {Entry<?,?> tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {if ((e.hash == hash) && e.key.equals(key)) {return (V)e.value;}}return null;}public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;@SuppressWarnings("unchecked")Entry<K,V> entry = (Entry<K,V>)tab[index];for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}}addEntry(hash, key, value, index);return null;}

2.synchronizedMap
Map<String,Object> synchronizedMap= Collections.synchronizedMap(new Hashtable<String,Object>());
它其实就是加了一个对象锁,每次操作hashmap都需要先获取这个对象锁,这个对象锁有加了synchronized修饰,锁性能跟hashtable差不多。

SynchronizedMap(Map<K,V> m, Object mutex) {this.m = m;this.mutex = mutex;}public int size() {synchronized (mutex) {return m.size();}}public boolean isEmpty() {synchronized (mutex) {return m.isEmpty();}}public boolean containsKey(Object key) {synchronized (mutex) {return m.containsKey(key);}}public boolean containsValue(Object value) {synchronized (mutex) {return m.containsValue(value);}}public V get(Object key) {synchronized (mutex) {return m.get(key);}}

3、ConcurrentHashMap
Map<String,Object> concurrentHashMap=new ConcurrentHashMap<String,Object>();

这个是目前使用最多,而且也是最推荐的一个集合,实现也是比较复杂的一个。我们看源码其实是可以发现里面的线程安全是通过cas+synchronized+volatile来实现的,其中也可看出它的锁是分段锁,所以它的性能相对来说是比较好的。整体实现还是比较复杂的。

--------------------------------------------写的不好,仅供参考------------------------------

几种线程安全的Map相关推荐

  1. 怎样实现两个线程共享一个集合_面试高频考察点:几种线程安全的Map解析

    Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不 ...

  2. 线程安全的map_面试必问-几种线程安全的Map解析

    HashMap线程安全的吗? Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 推荐阅读:我凭借这份pdf拿下了蚂蚁金服.字节跳动.小米等大厂的offer 看下面两个场景: ...

  3. 几种线程安全的Map解析

    HashMap线程安全的吗? Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不 ...

  4. 几种线程安全的Map解析,冲刺7天拿下Offer!

    4 年经验应该具备哪些技能 首先,简单的聊一下我认为的 4 年经验左右.优秀的 Java 程序员应该具备的技能有哪些,按"专业技能"和"项目"两块,包括但不限于 ...

  5. 多线程之 几种线程安全的Map及效率比较

    Java中平时用的最多的map就是hashmap但是它却是线程不安全的. 那除了hashmap还有哪些常见的线程安全的map?,今天我们就聊聊他们为什么是安全的 并用多线程读写1百条数据来验证他们的效 ...

  6. 几种线程安全的Map解析,真香系列

    1.笔试常见的问题? 面试常见的问题上面给的面试题链接基本都有.我只提几点: 写SQL:写SQL很常考察group by.内连接和外连接. 手写代码:手写代码一般考单例.排序.线程.消费者生产者.我建 ...

  7. golang实现线程安全的map

    转载自:https://halfrost.com/go_map_chapter_one/ https://halfrost.com/go_map_chapter_two/ Map 是一种很常见的数据结 ...

  8. golang 线程安全的map

    golang中的map是一种hashmap ,同时也是线程不安全的,并发读写时会发生panic go语言在sync包中提供了一种线程安全的map,他的数据结构如下 type Map struct {m ...

  9. [转]new Thread的弊端及Java四种线程池的使用

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...

最新文章

  1. QT 的信号与槽机制介绍
  2. 分享一个android debug模式,出现 waiting for debugger把界面卡住,取巧的解决办法
  3. 皮一皮:你更想成为哪个身材...
  4. matlab图像模糊处理
  5. c xaml语言教程,Xamarin XAML语言教程基础语法篇大学霸
  6. 南邮-2022年6月电子商务练习自整理 - 选择篇
  7. 通用模块(4)——EEPROM(AT24C08)
  8. emd经验模态分解 matlab,经验模态分解(EMD)在地球物理资料中的应用(附MATLAB程序)...
  9. Word2013自动生成中英文目录
  10. 妊娠糖尿病食谱、控糖食谱
  11. filter grok 判断_logstash grok使用案例
  12. 【更新ing】已有5个省份公布2020软考报名时间
  13. 苹果的新技术3D Touch与以往的“长按屏幕”有何区别?
  14. NPOI导出EXCEL 打印设置分页及打印标题
  15. 数据库简单sql语句(CURD)
  16. 使用码上登录实现微信扫码登录
  17. 利用高德地图API批量获取地点经纬度和行车线路与OD距离(excel和python)
  18. 续流二级管在电路的作用
  19. matlab如何取对数坐标,利用Matlab提取图片中曲线数据(线性修正,支持对数坐标)
  20. objectArx --- 层表、字体样式表

热门文章

  1. 如何在微信给视频照片做征集投票评分,教你快速制作投票评分小程序
  2. Altium Designer 18中的System–Transparency
  3. 打击恶意逃废债 捞财宝响应互金整治办报送“老赖”信息
  4. 服务器显卡芯片,Intel服务器独立显卡单卡四芯原来如此
  5. 使用DmAPService脚本启动dmap服务报错,报错信息:“failed to get ps!”
  6. mac 之 homebrew 配置Python环境
  7. Installation failed, reverting ./composer.json to its original content.
  8. Ant Design Vue table表格点击行选中多选框
  9. 如何在linux下运行python程序
  10. 三年级下册计算机全册教案,小学三年级下册信息技术教案三篇