ConcurrentHashMap的size操作
如果我们要统计整个ConcurrentHashMap
里元素的大小,就必须统计所有Segment
里元素的大小后求和。Segment
里的全局变量count是一个volatile
变量,那么在多线程场景下,我们是不是直接把所有Segment
的count相加就可以得到整个ConcurrentHashMap
大小了呢?不是的,虽然相加时可以获取每个Segment
的count的最新值,但是拿到之后可能累加前使用的count发生了变化,那么统计结果就不准了。所以最安全的做法,是在统计size的时候把所有Segment
的put
,remove
和clean
方法全部锁住,但是这种做法显然非常低效。
因为在累加count操作过程中,之前累加过的count发生变化的几率非常小,所以ConcurrentHashMap
的做法是先尝试2次通过不锁住Segment
的方式来统计各个Segment
大小,如果统计的过程中,容器的count发生了变化,则再采用全部Segment
加锁的方式来统计所有Segment
的大小。
那么ConcurrentHashMap
是如何判断在统计的时候容器是否发生了变化呢?使用modCount
变量,在put
, remove
和clean
方法里操作元素前都会将变量modCount
进行加1,那么在统计size前后比较modCount
是否发生变化,从而得知容器的大小是否发生变化。
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/14/concurrenthashmap-size/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论