`

HashMap如何实现线程安全

    博客分类:
  • java
 
阅读更多

1.使用HashTable

Map<String,Object> hashtable=new HashTable<>();

HashTable底层是数组和链表的形式,方法都是用synchronized修饰的,因此是线程安全的,但执行效率比较低。

2.使用java.util.concurrent.concurrentHashMap

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

concurrentHashMap结构图:

 

concurrentHashMap包含多个segment(最多16个),segment类似HashTable,是线程安全的,因此concurrentHashMap是一个segment数组,当有线程操作时,一个线程会操作一个segment,因此多线程也是安全的,有几个segment就允许几个线程同时操作。一般操作最先都是将key映射到对应的segment上。不需要锁这个类,分段锁。

使用锁分段技术,将数据分段存储,给每一段数据配一把锁,效率高。

java7中使用segment实现,对每个Segment加锁。

java8中直接在HashMap基础上进行加锁。

Segment:段

 

3.使用java.util.collections.synchronizedMap()方法包装HashMap,得到线程安全的Map

Map<String,Object> synchronizedHashMap=Collections.synchronizedMap(new HashMap<String,Object>());

synchrozizedMap的线程安全和HashTable一样,使用synchronized方法。

分享到:
评论

相关推荐

    Java魔法解密:揭秘HashMap底层机制.pptx.pptx

    HashMap的存储结构 HashMap内部采用数组和链表的方式存储数据,每个元素都包含...HashMap通过synchronized关键字实现线程安全,确保多线程环境下的数据一致性和并发访问的安全性,避免潜在的竞争条件和数据不一致问题。

    HashMap的特点与使用方法详解.docx

    HashMap 不是线程安全的;多线程环境下,建议使用 ConcurrentHashMap,或者使用 Collections.synchronizedMap(hashMap) 将 HashMap 转成线程同步的。 只能使用关联的键来获取值。 HashMap 只能存储对象,所以基本...

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别.docx

    HashMap底层实现原理HashMap与HashTable区别HashMap与HashSet区别。...因此,在多线程环境下,HashTable比HashMap更安全,但是性能可能较差。此外,HashMap允许将null作为键和值使用,而HashTable不允许。

    java中HashMap详解

    因此,在使用HashMap时需要进行同步处理或者使用线程安全的HashMap实现类。 动态扩容:当HashMap中的元素数量超过了容量(默认为16)与负载因子(默认为0.75)的乘积时,HashMap会自动扩容,即创建一个新的数组,并将...

    hashmap:一种Golang无锁,线程安全的HashMap,针对最快的读取访问进行了优化

    哈希图总览Golang无锁无线程安全HashMap,针对最快的读取访问进行了优化。用法为地图中的键设置值: m := &HashMap{}m.Set("amount", 123)从地图中读取键的值: amount, ok := m.Get("amount")使用地图来计数URL请求...

    面试官问你HashMap底层你用线程安全吊打他

    说起HashMap,我们可以先从底层实现说起,HashMap是通过hash算法,基于数组、链表和红黑树实现的,hash算法是一种思想,只要符合该思想的算法都是hash算法,其核心就是给定一个key,通过hash可以对应一个h(key),举...

    Java集合教程吐血整理干货.md

    HashMap在Jdk8之前使用拉链法实现,jdk8之后使用拉链法+红黑树实现。 HashMap是线程不安全的,并允许null key 和 null value。 HashMap在我当前的jdk版本(11)的默认容量为0,在第一次添加元素的时候才初始化容量为 16, ...

    hashmap和hashtable的区别.docx

    2. HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了...

    HashMap源码讲解(视频+资料+面试题目)

    HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null 值, 因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入...HashMap是线程不安全的。

    阿里百度美团面试题合集

    Java 如何实现线程安全 . Synchronized 和 Lock 哪个更好? . HashMap 中的 get()方法是如何实现的? . HashMap 可以用在哪些场景? . JVM,垃圾回收机制,内存划分等 . SQL 优化,常用的索引? . 还有什么问题需要...

    Java集合框架完整说明便于了解集合

    HashMap 和 Hashtable 的区别,HashSet如何检查重复,HashMap的底层实现,HashMap 多线程操作导致死循环问题,ConcurrentHashMap 和 Hashtable 的区别,ConcurrentHashMap线程安全的具体实现⽅式/底层具体实现,...

    java程序员面试题

    HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key或者...

    125条常见的java面试笔试题大汇总

    HashMap是Hashtable的轻量级实现(非线程安全的实现) ,他们都完成了Map接口 主要区别在于HashMap允许空(null) 键值(key),由于非线程安全,效率上可能高于Hashtable。 HashMap允许将null作为一个entry的key...

    JavaSE 笔试 精华

    HashMap实现了Map接口,不是线程安全的。 如何保证线程安全的?每个修改容器中数据的操作都是同步的(synchronized),因此保证了线程安全。 3. String、StringBuffer,StringBuilder之间区别。 String是长度不可变...

    有关hashMap跟hashTable的区别,说法正确的是?

    题目 (多选)有关hashMap跟hashTable的区别,说法正确的是? A. HashMap和Hashtable都实现了Map接口 B. HashMap是非synchronized,而Hashtable是synchronized C....由于Hashtable是线程安全的也是sy

    Hashtable和HashMap的区别:

    Hashtable和HashMap的区别: ...即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:

    concurrent 多线程 教材

    13 Java 理论与实践: 描绘线程安全性 (2) 14 编写高效的线程安全类 (2) 15 轻松使用线程 同步不是敌人.mht 16 轻松使用线程 减少争用.mht 17 轻松使用线程 不共享有时是最好的.mht 18 适用于 Java 程序员的 CSP...

    HashMap 源码分析

    是不是觉得很熟悉,没错这玩意在1.8之前的结构就和HashTable一样都是采用数组+链表,同样也是通过链地址法(这里简称拉链法)来解决冲突,但是HashMap和HashTable的区别是一个是线程安全的,一个是非线程安全的。...

    Java岗位常规面试题.pdf

    4. 请解释Java中的线程安全(Thread Safety)是什么,以及如何实现线程安全的代码。 5. 什么是Java中的异常处理(Exception Handling)机制?请说明在Java中异常处理的方法和最佳实践。 6. Java中的什么机制实现了...

    HashMap和Hashtable的区别

    Hashmap是开发中用的比较多的一种集合,是线程不安全的,Hashtable的方法上大多都加了synchronized所以是线程安全的,所以效率并不高。这也是它们最大的不同。  2.Hashtable继承的类和实现的接口:(Dictionary类...

Global site tag (gtag.js) - Google Analytics