美文网首页
简单总结ConcurrentHashMap

简单总结ConcurrentHashMap

作者: yaco | 来源:发表于2020-07-16 16:17 被阅读0次

在并发使用到HashMap的时候,往往不建议直接用HashMap,因为HashMap在并发写数据的时候容易因为rehash的过程产生环形链表的情况。所以在并发使用Map结构时,一般建议使用ConcurrentHashMap。

1 JDK1.7 的ConcurrentHashMap

在JDK1.7中ConcurrentHashMap采用了数组+Segment+分段锁的方式实现。

  • Segment(分段锁):ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表,同时又是一个ReentrantLock(Segment继承了ReentrantLock)。
  • 内部结构:ConcurrentHashMap使用分段锁技术,将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问,能够实现真正的并发访问。如下图是ConcurrentHashMap的内部结构图:
    image.png

从上面的结构我们可以了解到,ConcurrentHashMap定位一个元素的过程需要进行两次Hash操作。第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部。

2 JDK1.8之后的ConcurrentHashMap

JDK8中ConcurrentHashMap参考了JDK8 HashMap的实现,采用了数组+链表+红黑树的实现方式来设计,内部大量采用CAS操作。并发控制使⽤synchronized 和 CAS 来操作。(JDK1.6 以后 对 synchronized 锁做了很多优化) 整个看起来就像是优化过且线程安全的 HashMap,虽然在 JDK1.8 中还能看到 Segment 的数据结构,但
是已经简化了属性,只是为了兼容旧版本;

JDK1.8的Nod节点中value和next都用volatile修饰,保证并发的可见性。

可以理解为,synchronized 只锁定当前链表或红⿊⼆叉树的⾸节点,这样只要 hash 不冲突,就不会产⽣并发,效率⼜提升 N 倍。


image.png

3 ConcurrentHashMap和HashTable的区别

Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采⽤ 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突⽽存在的;

Hashtable(同⼀把锁) :使⽤ synchronized 来保证线程安全,效率⾮常低下。当⼀个线程访问同步⽅法时,其他线程也访问同步⽅法,可能会进⼊阻塞或轮询状态,如使⽤ put 添加元素,另⼀个线程不能使⽤ put 添加元素,也不能使⽤get,竞争会越来越激烈效率越低;

总结一下:

  • ConcurrentHashMap不论1.7还是1.8,他的执行效率都比HashTable要高的多,主要原因还是因为Hash Table使用了一种全表加锁的方式。


    image.png

参考:

JavaGuide

相关文章

  • 简单总结ConcurrentHashMap

    在并发使用到HashMap的时候,往往不建议直接用HashMap,因为HashMap在并发写数据的时候容易因为re...

  • ConcurrentHashMap-JDK1.7版

    分析一下ConcurrentHashMap的成员变量: 总结:ConcurrentHashMap中包含一个segm...

  • ConcurrentHashMap总结

    其实可以看出JDK1.8版本的ConcurrentHashMap的数据结构已经接近HashMap,相对而言,Con...

  • ConcurrentHashMap总结

    1. 总结:如何保证线程线程安全 CAS操作数据:table数组的取值/设置值、链表的数值操作、sizeCtl修改...

  • ConcurrentHashMap 1.7总结

    一、通过Key找到在Segment[]数组中的位置: 1. 变量定义: ssize: 不小于concurrency...

  • ConcurrentHashMap的总结

    HashMap的创建 指定参数时: 不指定参数时: 数组的初始化发生在initTable()中。 元素访问操作 插...

  • ConcurrentHashMap详细总结

    上文详细介绍了HashMap的内容,但是由于HashMap不是线程安全的,因此使用起来会存在一定的风险。本文主要介...

  • ConcurrentHashMap并发总结

    ConcurrentHashMap(以下称为CHM)各版本JDK 5:分段锁,必要时加锁。通过Segment来分段...

  • ConcurrentHashMap源码阅读小结

    putVal 方法总结 说起 ConcurrentHashMap ,当然从入口开始说。该方法要点如下: 1. 不允...

  • ConcurrentHashMap源码分析(JDK8)

    导入 ConcurrentHashMap是HashMap的线程安全版本的实现版本,关于HashMap的分析总结,可...

网友评论

      本文标题:简单总结ConcurrentHashMap

      本文链接:https://www.haomeiwen.com/subject/pznghktx.html