ConcurrentHashMap 1.7总结

2018-08-19  本文已影响0人  北雁南飞_8854

一、通过Key找到在Segment[]数组中的位置:

1. 变量定义:

ssize:

不小于concurrencyLevel的最小2的N次方, 默认concurrencyLevel等于16;

segmentShift:

32 - ssize从1左移的位数;

segmentMask:

ssize - 1;

key的hash方法

key的hash方法.png

2. 通过UnSafe获取Segment[]数组中下标为index的元素的地址

index对应的Segment数组元素.png

3. 将Key放在HashMap的合适位置

3.1 由key确定在Segment[]数组中的下标
key在Segment数组中的下标.png
3.2 将Key插入到Segment中的合适的位置

① 获取key在table中的下标,记为index。
index = hash & (table.length - 1);
② 取table[index]的头部HashEntry,记为first。若first == null,表示table的index下标位置为null,新建一个HashEntry放置在table[index]的头部;若first != null,则进入③:
③ 从first开始沿链表遍历,若找到
(e.key == key || (e.hash == hash && key.equals(e.key))
则表示table中key已存在,用value替换oldValue,并返回oldValue;若直到链表的末尾也没找到,则构建新的HashEntry插入table[index]的链表头部。

3.3 put操作获取Segment的自旋锁的过程
获取自旋锁和预创建节点.png

4. UnSafe的常量

UnSafe常量.png
上一篇 下一篇

猜你喜欢

热点阅读