首页 > 其他分享 >HashMap线程安全面试题(含答案)

HashMap线程安全面试题(含答案)

时间:2022-11-30 17:45:36浏览次数:69  
标签:Map 面试题 HashMap 安全 线程 含答案

HashMap线程安全面试题(含答案)

HashMap线程安全面试题(含答案)

Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的。
看下面两个场景:
1、当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不安全的问题了。
2、当用在单例对象成员变量的时候呢?这时候多个线程过来访问的就是同一个HashMap了,对同个HashMap操作这时候就存在线程安全的问题了。

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

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(newHashMap<String, Object>());

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

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

3、ConcurrentHashMap - 推荐

private Map<String, Object> map = new ConcurrentHashMap<>();

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

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

 

标签:Map,面试题,HashMap,安全,线程,含答案
From: https://www.cnblogs.com/biubiu111/p/16939221.html

相关文章

  • 【Jmeter】21天打卡 10线程用户之setUp和tearDown
    作业要求:1、添加setUp线程组和tearDown线程组2、添加线程组HTTP请求(2个以上),查看结果树3、由于httpbin.org不存在登录机制,所以setUp和tearDown用两个任意get请求代替,HTT......
  • Python高级-多任务线程-笔记
    1.多任务的概念什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务......
  • java并发编程(一)-线程相关的基本概念
    CPU核心数和线程数的关系核心数:线程数=1:1intel引入超线程技术之后--》核心数:线程数=1:2CPU时间片轮转机制-又称RR调度 时间片轮转法(Round-Robin,RR)主要用于分时系统......
  • java并发编程(三)-线程的协作式
    怎么样才能让Java里的线程安全停止工作呢?一般来说:程序执行完或者抛出异常。怎么用代码的方式将线程停止呢?可以看到stop(),resume(),suspend()已不建议使用,stop()会导致线程......
  • 生产环境连接池和线程池配置参考
    <beanid="dataSource1"class="org.apache.commons.dbcp.BasicDataSource"><propertyname="driverClassName"value="${db.jdbc.driverClassName}"/><propertynam......
  • 线程的生命周期
    线程的状态线程的状态:也就是线程从生到死的过程,以及中间经历的各种状态及状态转换。理解线程的状态有利于提升并发编程的理解能力。Java线程的状态Java总共定义了6种状态6......
  • 打赌你无法解决这个Google面试题
    英文|  https://medium.com/free-code-camp/bet-you-cant-solve-this-google-interview-question-4a6e5a4dc8eeTechLead的问题在这个问题中,TechLead要求我们观察下面的......
  • 线程池处理Callable任务
    线程池如何处理Callable任务线程池如何处理Callable任务,并得到任务执行完后返回的结果。使用ExecutorService的方法:Future<T>submit(Callable<T>command)packagecom.......
  • Executors:线程池的工具类处理线程
    Executors:线程池的工具类处理线程Executors得到线程池对象的常用方法Executors:线程池的工具类通过调用方法返回不同类型的线程池对象。Executors的底层其实也是基于线......
  • 线程池处理Runnable任务
    线程池如何处理Runnable任务使用ExecutorService的方法:voidexecute(Runnabletarget)packagecom.itheima.d8_threadpool;publicclassMyRunnableimplementsRunn......