ConcurrentHashMap的size原理

jdk1.7 ConcurrentHashMap的size原理

简而言之,累加各个segment的size,记为sum,统计两次,如果sum值相同且modnum(put,remove等都会进行加一
操作)不变,则返回,否则,加锁重新统计

jdk1.8 ConcurrentHashMap的size原理

每次put时,cas加一,操作的对象有BaseCount和CounterCell数组(其长度未必和map中table一样长)。
流程是先尝试对BaseCount进行cas加一,失败则通过Thread.probe()获得一个线程间不太可能重复的hash值
选定一个CounterCell(如果没有需要先初始化),对他进行cas加一,如果失败,重复该流程直到成功。

当需要计算size时,累加BaseCount和CounterCell中的值,然后返回。所以size方法可能出现偏差。

这里为什么使用BaseCount和CounterCell数组记录size,说白了还是为了减少竞争。

描述ConcurrentHashMap的size()方法很好的文章

猜你喜欢

转载自blog.csdn.net/qq_41634872/article/details/110248107