本过程参考网上资料以及哔哩哔哩网站鲁班学院-周瑜老师的讲课内容进行整理,仅供学习使用。感谢各位大佬!如有侵权请联系。
1、数据结构
ConcurrentHashMap是线程安全的,它的底层结构简单理解就是如下图形式。一旦初始化后Segment[]就不能再变化了,put、扩容都是针对每一个segment内的HashEntry来操作。而HashEntry其实跟JDK1.7的HashMap类似[数组+链表]。
2、主要变量
3、构造函数[主要的构造函数]
4、put过程
4.1 对Segment[j]初始化操作
4.2 对Segment[u]进行put
4.2.1 没获取到锁的线程在做什么事?==scanAndLockForPut(),这个方法简单来说就是,当有两个线程同时最某一个Segment[index]下的HashEntry操作时,第一个线程已经获取了操作权,则第二个线程只能等待,但是等待过程也不能干等着,而是根据key、value等值去先创建好node节点,等第一个线程释放锁后,第二个操作HashEntry时就直接放新建的node节点了。
5、扩容过程,扩容也是对某一个Segment[index]下HashEntry进行扩容
6、get过程
根据key找到对应的Segment[index],然后在找到Segment[index]下的HashEntry[index],然后在遍历链表一次比对key