HashMap 详解

实现原理

  1. 底层实现是数组,数组项为链表,Entry<K,V>。
  2. 存值时,若有2个key的hash值相同,则会比较key是否相同,相同则覆盖,不同则用链表串起来。
  3. 取值时,通过key对应的hash值找到在table数组中的索引处的Entry,然后返回该key对应的value即可。
  4. 线程不安全的点:存值和扩容时。尤其在扩容时还可能导致死循环,直接把应用搞挂。

可选择的线程安全的Map

Hashtable , synchronizedMap , ConcurrentHashMap
HashTable和synchronizedMap锁住了整个Map,CHM只锁住部分Map。所以CHM效率最高。

ConcurrentHashMap的实现

在 ConcurrentHashMap内部有一个Segment段,它将大的HashMap切分成若干个段(小的HashMap),然后让数据在每一段上Hash,这样多个线程在不同段上的Hash操作一定是线程安全的,所以只需要同步同一个段上的线程就可以了,这样实现了锁的分离,大大增加了并发量。

  1. CHM默认的并发级别是16,但可以在创建CHM时通过构造函数改变。毫无疑问,并发级别代表着并发执行更新操作的数目,所以如果只有很少的线程会更新Map,那么建议设置一个低的并发级别。另外,CHM还使用了ReentrantLock来对segments加锁。
  2. putIfAbsent
  3. CHM允许并发的读和线程安全的更新操作
    在执行写操作时,CHM只锁住部分的Map
    并发的更新是通过内部根据并发级别将Map分割成小部分实现的
    高的并发级别会造成时间和空间的浪费,低的并发级别在写线程多时会引起线程间的竞争
    CHM的所有操作都是线程安全
    CHM返回的迭代器是弱一致性,fail-safe并且不会抛出ConcurrentModificationException异常
    CHM不允许null的键值
    可以使用CHM代替HashTable,但要记住CHM不会锁住整个Map
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容