ConcurrentHashMap 总结( 下 )

前端之家收集整理的这篇文章主要介绍了ConcurrentHashMap 总结( 下 )前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转自:nofollow">https://mp.weixin.qq.com/s?__biz=MjM5NzMyMjAwMA==&mid=2651479108&idx=3&sn=6f6a7cfa0093e3eba8306de6e42d5ecf&chksm=bd25303b8a52b92d1788bebfbdda5ff11a79afcd1604cdea79634dcdb3c3d5c3386f000dd25a&mpshare=1&scene=23&srcid=0925tKa60HZ2adVcJk2dT44u#rd

<p style="clear:both;min-height:1em;color:rgb(62,62,62);font-family:'Helvetica Neue',Helvetica,'Hiragino Sans GB','Microsoft YaHei',Arial,sans-serif;font-size:16px;">
<span style="color:rgb(123,12,0);">2.8 Size相关的方法


<p style="clear:both;min-height:1em;color:rgb(62,sans-serif;font-size:16px;">

数量,因为不可能在调用size()方法的时候像GC的“stop the world”一样让其他线程都停下来让你去统计,因此只能说这个数量是个估计值。对于这个估计值,ConcurrentHashMap也是大费周章才计算出来的。

2.8.1 辅助定义

统计元素个数,ConcurrentHashMap定义了一些变量和一个内部类

2.8.2 mappingCount与Size方法

方法的类似  从Java工程师给出的注释来看,应该使用mappingCount代替size方法 两个方法都没有直接返回basecount 而是统计一次这个值,而这个值其实也是一个大概的数值,因此可能在统计的时候有其他线程正在执行插入或删除操作。

(long)Integer.MAX_VALUE) ? Integer.MAX_VALUE :

2.8.3 addCount方法

方法结尾处调用了addCount方法,把当前ConcurrentHashMap的元素个数+1这个方法一共做了两件事,更新baseCount的值,检测是否进行扩容。

方法更新baseCount的值 

= 0) {

[] tab,nt; int n,sc;

= (long)(sc = sizeCtl) && (tab = table) != null &&

>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 ||

统计全局时(比如size),首先会尝试多次计算modcount来确定,这几次尝试中,是否有其他线程进行了修改操作,如果没有,则直接返回size。如果有,则需要依次锁住所有的Segment来计算。

性能,所以jdk8 中完全重写了concurrentHashmap,代码量从原来的1000多行变成了 6000多 行,实现上也和原来的分段式存储有很大的区别。

猜你在找的Java相关文章