ConcurrentHashMap 结构 1.7 与1.8

Posted baizhuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ConcurrentHashMap 结构 1.7 与1.8相关的知识,希望对你有一定的参考价值。

1.结构

1.7 segment+HashEntity+Unsafe

1.8 移除Segment,使锁的粒度更小,Synchronized+CAS+Node+Unsafe

2. put()

1.7 先定位 Segment,再定位桶, put 全程加锁,没有获取锁的线程提前找桶的位置,并最多自旋64次获取锁,超过则挂起

18. 由于移除了Segment,类似HashMap.可以直接定位到桶,拿到 first 节点后进行判断

  1.为空则 CAS 插入

  2.为 -1 则说明再扩容,咋跟着一起扩容

  3. else 则加锁 put 

3.get()

基本类似,由于value 声明为 volatile ,保证修改可见性

4.resize()

1.7:跟HashMap步骤一样,只不过是搬到单线程中执行,避免了HashMap在1.7中扩容时死循环的问题,保证线程安全。

1.8:支持并发扩容,HashMap扩容在1.8中由头插改为尾插(为了避免死循环问题),ConcurrentHashmap也是,迁移也是从尾部开始,扩容前在桶的头部放置一个hash值为-1的节点,这样别的线程访问时就能判断是否该桶已经被其他线程处理过了。

5.size()

1.7:很经典的思路:计算两次,如果不变则返回计算结果,若不一致,则锁住所有的Segment求和。

1.8:用baseCount来存储当前的节点个数,这就设计到baseCount并发环境下修改的问题(说实话我没看懂-_-!)。

参考:https://blog.csdn.net/u013374645/article/details/88700927

 

以上是关于ConcurrentHashMap 结构 1.7 与1.8的主要内容,如果未能解决你的问题,请参考以下文章

ConcurrentHashMap 源码浅析 1.7

源码分析 CurrentHashMap 1.7

Java并发编程23ConcurrentHashMap原理分析(1.7和1.8版本对比)

并发编程—6ConcurrentHashMap1.7 & 1.8

ConcurrentHashMap 1.7和1.8区别

ConCurrentHashMap在1.7和1.8区别