首页 > 其他 > 详细

ConcurrentHashMap源码分析

时间:2016-02-22 19:13:45      阅读:155      评论: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
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!