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解析相关推荐

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

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

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

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

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

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

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

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

  5. 几种线程安全的Map

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

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

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

  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. JAVA线程安全Map解析

    JAVA线程安全Map解析 HashTable 结构 线程安全的实现 Collections.synchronizedMap 线程安全的实现 ConcurrentHashMap 线程安全的实现 Con ...

最新文章

  1. 2018-3-7论文网络评论中非结构化信息的表示与研究--------实验分析
  2. MSICE界面和功能分析
  3. java 缓存的简单实现_Java8简单的本地缓存实现
  4. MySQL分组函数的使用特点
  5. JAVA ReentrantLock 分析
  6. 在 k8s 中部署 Prometheus 和 Grafana
  7. Codeforces Round #673 (Div. 2)——待补 E
  8. 游戏详细设计说明书_宜家的说明书设计脑洞太大了!
  9. python如何确定拐点_python – 在样条拟合1d数据中找到拐点
  10. 支持60+数据传输链路,华为云DRS链路商用大盘点
  11. 一步步实现SDDC-分布式交换机入门
  12. 搭建Zabbix Proxy HA
  13. linux终端<Terminal>使用ping
  14. java代码内创建mysql索引_点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)...
  15. 强大的端到端语音识别框架—RNN-T
  16. QT应用SQL数据库,简单全面的应用,增删改查。
  17. php++redius,【答疑】edius中快进播放的快捷键是什么啊? - 羽兔网问答
  18. Unity 安卓打包
  19. linux mysql max_allowed_packet_Linux服务器上如何设置MySQL的max_allowed_packe
  20. 基于MFC和OpenCV的图像处理小软件

热门文章

  1. 华院计算 | 东方文艺复兴式的学者—朱载堉
  2. (转载)Windows 无法连接到打印机,键入打印机名不正确 解决办法
  3. cf-Enduring Exodus
  4. [渝粤教育] 武汉体育学院 中国少数民族神话赏析 参考 资料
  5. C语言——全局变量的定义与声明
  6. 【生成函数】五边形数定理与整数划分问题详解
  7. 中国智慧景区联盟今日成立 发布《中国智慧景区九寨沟宣言》
  8. 8个球7个一样重的,有一个偏重,一个天平,如何两次找出偏重的小球
  9. 工资薪酬不需要缴个人所得税的项目有哪些
  10. main方法和单元测试方法