Java并发之并发容器ConcurrentHashMap

为什么要使用ConcurrentHashMap?

  1. HashMap线程不安全,多个线程同时putVal会造成死循环(在扩容过程中,链表成环)
    扩容过程:遍历旧桶,对每个桶里的链表entry,使用头插法放入对应新桶,即与原来的顺序相反。头插法过程中会改变头节点,当一个线程resize进度快于另外一个线程时,就会出现前一个链表插入后的后继仍然时原来的后继节点,这就出现了环。参考
  2. Hashtable效率底下,(依靠synchronized来同步方法)不能多读。
  3. ConcurrentHashMap利用锁分段技术,用多把锁提升了并发访问,同时扩容也只涉及到单个段,不涉及全部的段

ConcurrentHashMap结构

参考

Java并发编程的技术

Author: whllhw
Link: https://whllhw.ml/posts/2019/08/19/Java并发之并发容器ConcurrentHashMap/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.