码迷,mamicode.com
首页 > 其他好文 > 详细

ConcurrentHashMap源码分析

时间:2016-02-22 19:16:22      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

 

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源码分析

标签:

原文地址:http://www.cnblogs.com/chy2055/p/5207842.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!