前言
最近在学习ConcurrentHashMap的源码,发现它采用了一种比较独特的方式对map中的元素数量进行统计,自然是要好好研究一下其原理思想,同时也能更好地理解ConcurrentHashMap本身。
本文主要思路分为以下4个部分
1.计数的使用效果
2.原理的直观图解
3.源码的细节分析
4.与AtomicInteger的比较
5.思想的抽象
学习的入口自然是map的put方法
publicVput(Kkey,Vvalue){returnputVal(key,value,false);}查看putVal方法
这里并不对ConcurrentHashMap本身的原理作过多讨论,因此我们直接跳到计数部分
finalVputVal(Kkey,Vvalue,booleanonlyIfAbsent){...addCount(1L,binCount);returnnull;}每当成功添加一个元素之后,都会调用addCount方法进行数量的累加1的操作,这就是我们研究的目标
因为ConcurrentHashMap的设计初衷就是为了解决多线程并发场景下的map操作,因此在作数值累加的时候自然也要考虑线程安全
当然,多线程数值累加一般是学习并发编程的第一课,本身并非很复杂,可以采用AtomicInteger或者锁等等方式来解决该问题
然而如果我们查看该方法,就会发现,一个想来应该比较简单的累加方法,其逻辑看上去却相当复杂
这里我只贴出了累加算法的核心部分
privatefinalvoidaddCount(longx,intcheck){CounterCell[]as;longb,s;if((as=counterCells)!=null
!U.