上海建站宝盒,做中英文网站多少钱,临海app开发,网站排名易下拉技术转载自 面试必问#xff0d;几种线程安全的Map解析HashMap线程安全的吗#xff1f;Java中平时用的最多的Map集合就是HashMap了#xff0c;它是线程不安全的。看下面两个场景#xff1a;1、当用在方法内的局部变量时#xff0c;局部变量属于当前线程级别的变量#xff0c;…转载自 面试必问几种线程安全的Map解析HashMap线程安全的吗Java中平时用的最多的Map集合就是HashMap了它是线程不安全的。看下面两个场景1、当用在方法内的局部变量时局部变量属于当前线程级别的变量其他线程访问不了所以这时也不存在线程安全不安全的问题了。2、当用在单例对象成员变量的时候呢这时候多个线程过来访问的就是同一个HashMap了对同个HashMap操作这时候就存在线程安全的问题了。线程安全的Map为了避免出现场景2的线程安全的问题不能使用HashMap作为成员变量要寻求使用线程安全的Map下面来总结下有哪些线程安全的Map呢1、HashTableprivate MapString, Object map new Hashtable();来看看HashTable的源码HashTable的get/put方法都被synchronized关键字修饰说明它们是方法级别阻塞的它们占用共享资源锁所以导致同时只能一个线程操作get或者put而且get/put操作不能同时执行所以这种同步的集合效率非常低一般不建议使用这个集合。2、SynchronizedMapprivate MapString, Object map Collections.synchronizedMap(new HashMapString, Object());这种是直接使用工具类里面的方法创建SynchronizedMap把传入进行的HashMap对象进行了包装同步而已来看看它的源码。这个同步方式实现也比较简单看出SynchronizedMap的实现方式是加了个对象锁每次对HashMap的操作都要先获取这个mutex的对象锁才能进入所以性能也不会比HashTable好到哪里去也不建议使用。3、ConcurrentHashMap - 推荐private MapString, Object map new ConcurrentHashMap();这个也是最推荐使用的线程安全的Map也是实现方式最复杂的一个集合每个版本的实现方式也不一样在jdk8之前是使用分段加锁的一个方式分成16个桶每次只加锁其中一个桶而在jdk8又加入了红黑树和CAS算法来实现。虽然实现起来很复杂但使用起来也是非常简单的在java面试中问的频率也非常高最重要的是性能要比上面两种同步方式要快太多推荐使用。