HashMap线程安全的吗?

Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的。

推荐阅读:我凭借这份pdf拿下了蚂蚁金服、字节跳动、小米等大厂的offer

看下面两个场景:

1、当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不安全的问题了。

2、当用在单例对象成员变量的时候呢?这时候多个线程过来访问的就是同一个HashMap了,对同个HashMap操作这时候就存在线程安全的问题了。

线程安全的Map

为了避免出现场景2的线程安全的问题,不能使用HashMap作为成员变量,要寻求使用线程安全的Map,下面来总结下有哪些线程安全的Map呢?

1、HashTable

private Map map = new Hashtable<>();

来看看HashTable的源码

HashTable的get/put方法都被synchronized关键字修饰,说明它们是方法级别阻塞的,它们占用共享资源锁,所以导致同时只能一个线程操作get或者put,而且get/put操作不能同时执行,所以这种同步的集合效率非常低,一般不建议使用这个集合。

2、SynchronizedMap

private Map map = Collections.synchronizedMap(new HashMap());

这种是直接使用工具类里面的方法创建SynchronizedMap,把传入进行的HashMap对象进行了包装同步而已,来看看它的源码。

这个同步方式实现也比较简单,看出SynchronizedMap的实现方式是加了个对象锁,每次对HashMap的操作都要先获取这个mutex的对象锁才能进入,所以性能也不会比HashTable好到哪里去,也不建议使用。

3、ConcurrentHashMap - 推荐

private Map map = new ConcurrentHashMap<>();

这个也是最推荐使用的线程安全的Map,也是实现方式最复杂的一个集合,每个版本的实现方式也不一样,在jdk8之前是使用分段加锁的一个方式,分成16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。

虽然实现起来很复杂,但使用起来也是非常简单的,在java面试中问的频率也非常高,最重要的是性能要比上面两种同步方式要快太多,推荐使用。

线程安全的map_面试必问-几种线程安全的Map解析相关推荐

  1. 线程同步有几种方法_架构师面试必问的多线程状态切换及常用方法

    架构师面试必问的多线程状态切换及常用方法 一.问题背景 Java架构师面试中,多线程状态切换及常用方法几乎是必问的,要掌握创建多线程的方式和方法. 二.创建多线程的几种方式 2.1方式一继承Threa ...

  2. 面试必问:多线程与线程池

    前言 前几章都在讲一些锁的使用和原理,主要是为了保证多线程情况下变量的原子性,但这并不是说多线程不好,合理利用还是有好处的.至于什么好处,看下面内容就懂了,先打个比方吧(谁叫比方,上来挨打):假如你体 ...

  3. 面试必问的线程池,你懂了吗?

    微信搜索[程序员囧辉],关注这个坚持分享技术干货的程序员. 前言 在上次和二狗的"HashMap 最强者"PK后,二狗一直耿耿于怀,经常缠着我要复仇,甚至愿意出卖自己的屁股???我 ...

  4. 互联网公司面试必问的Redis题目

    https://juejin.im/post/5b99d4bce51d450e7a24b66e#heading-0 Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用 ...

  5. 面试必问的 CAS ,要多了解

    转载自 面试必问的 CAS ,要多了解 前言 CAS(Compare and Swap),即比较并替换,实现并发算法时常用到的一种技术,Doug lea大神在java同步器中大量使用了CAS技术,鬼斧 ...

  6. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  7. 【Android面试】Android中高级开发面试必问,7年外包一飞冲天

    Andorid 开发在前两年也非常火热,但随着客户端开发招聘回归理性,行业已经越来越成熟,岗位招聘也就自然而然地变"卷"了.这一点,身为程序员老鸟的我深有体会. 年初,我就开始投递 ...

  8. 面试必问的CAS,你懂了吗?

    微信搜索[程序员囧辉],关注这个坚持分享技术干货的程序员. 我的最新文章:BAT 老兵的经验之谈,成长路上这个道理越早知道越好 目录 概述 案例 CAS是什么? 源码分析 intel手册对lock前缀 ...

  9. Android面试必问框架原理

    Android面试必问框架原理 volatile的实现原理 synchronized的实现原理 join方法实现原理 CAS无锁编程的原理 ReentrantLock的实现原理 AQS的大致实现思路 ...

最新文章

  1. Android studio Day02-1
  2. 通过图形界面配置Exchange2010 DAG
  3. VLC-DSS搭建直播系统中链路断开影响测试
  4. nGQL-为什么路径越长,数量越多呢,直觉是条件越严格,路径数量会越少
  5. 安装rpm包命令_编程模板-R语言脚本写作:最简单的统计与绘图,包安装、命令行参数解析、文件读取、表格和矢量图输出...
  6. 合并重定向 command file 21 解析
  7. visual studio 调试python_Visual Studio Code Python 调试设置
  8. API设计原则 - Qt官网的设计实践总结
  9. 数据库实验三 SQL查询数据
  10. 共阴极数码管编码表_数码管循环点亮的PLC控制——基本逻辑指令的应用
  11. C语言 文件读写 fputc 函数 - C语言零基础入门教程
  12. android存到手机内存,android保存文件到手机内存
  13. aqara (737) -(a俩)_A-史密斯:勇士有人类已知的最强后场组合,湖人很难限制
  14. 从武汉模式走向中国模式,打造人工智能产业发展的“中国样板”
  15. 我的内核学习笔记9:Intel内部看门狗iTCO_wdt驱动
  16. python转置列表代码_转置字典(从字典列表中提取一个键的所有值)
  17. 关于C++宏:AFX_EXT_CLASS
  18. 华为设备DHCP/DHCP中继及DHCPv6/DHCPv6中继详解
  19. 轻轻松松学会Python入门一:初识Python
  20. 小红书去水印代码_最新小红书视频去水印解析API接口

热门文章

  1. 为什么我墙裂建议大家使用枚举来实现单例。
  2. Jeecg入门篇,高手掠过
  3. Hadoop数据压缩 与 数据清洗ETL
  4. hadoop3.2.2--记录java.io.IOException: All specified directories have failed to load.问题
  5. react native 0.56.0
  6. ui-router 1.0 001 - resolve, component, sref-active
  7. protocol_buffers简易操作
  8. js文件代码未加载或者没有js效果
  9. ZZULIOJ 1107: 回文数猜想(函数专题)
  10. 信息学奥赛一本通 1181:整数奇偶排序 | OpenJudge NOI 1.10 06:整数奇偶排序