ConcurrenntHashMap
jdk1.7
存储结构
-
Segment 数组 + HashEntry 数组 + 链表
- Segment默认等于16,可以认为 ConcurrentHashMap 默认支持最多 16 个线程并发
初始化
-
三个参数
- CAPACITY默认初始化容量16
- FACTOR默认负载因子0.75
- CONCURRENCY_LEVEL默认并发级别16
put
-
计算出 segment 下标
-
获得 segment 对象, 判断是否为 null, 是则创建该 segment
- 这时不能确定是否真的为 null, 因为其它线程也发现该 segment 为 null, 因此在 ensureSegment 里用 cas 方式保证该 segment 安全性
-
进入 segment 的put 流程
-
尝试加锁
- 如果不成功, 进入 scanAndLockForPut 流程
如果是多核 cpu 最多 tryLock 64 次, 进入 lock 流程
在尝试期间, 还可以顺便看该节点在链表中有没有, 如果没有顺便创建出来
- 如果不成功, 进入 scanAndLockForPut 流程
-
更新或者新增
-
新增
- 之前等待锁时, node 已经被创建, next 指向链表头否则创建新 node,count+1
- 根据count,看是否需