ConcurrentHashMap源码分析

Posted

tags:

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

 

ConcurrentHashMap是线程安全的HashMap的实现。 

put(Object key, Object value):

  ConcurrentHashMap并没有在此方法上加上synchronized,首先判断value是否为null,如为null,则抛出NullPointerException,如不为null,则继续下面的步骤: 

  和HashMap一样,首先对key.hashCode进行hash操作,得到keyhash值。Hash操作的算法和HashMap也不同。

  根据此hash值计算并获取其对应的数组中的Segment对象。

  在找到了数组中的Segment对象后,接着调用Segment对象的put方法来完成当前操作。

  当调用Segment对象的put方法时,首先进行lock操作,接着判断当前存储的对象个数加1后是否大于threshold。如果大于,则将当前的HashEntry对象数组大小扩大两倍,并将之前存储的对象重新hash,转移到新的对象数组中。

  ConcurrentHashMap基于concurrencyLevel划分出了多个Segment来对key-value进行存储,从而避免每次put操作都得锁住整个数组。在默认的情况下,最佳情况下,可以允许16个线程并发无阻塞的操作集合对象,尽可能地减少并发时的阻塞现象。

 

Remove(Object key)

  首先对key.hashCode进行hash操作,基于得到hash的值找到对应的Segment对象,调用其remove方法完成当前操作。

  Segmentremove方法进行加锁操作,操作完后,会释放锁。

 

  ConcurrentHashMap默认情况下,采用将数据分为16个段进行存储,并且16个段分别持有各自的锁,锁仅用于putremove等改变集合对象的操作,读取数据不加锁。

以上是关于ConcurrentHashMap源码分析的主要内容,如果未能解决你的问题,请参考以下文章

ConcurrentHashmap核心源码分析

两万五千字的ConcurrentHashMap底层原理和源码分析

ConcurrentHashMap源码解析_04 transfer方法源码分析(难点)

ConcurrentHashMap源码解析_04 transfer方法源码分析(难点)

ConcurrentHashMap源码解析文章总目录

ConcurrentHashMap实现原理及源码分析