上一题下一题

ConcurrentHashMap 的 computeIfAbsent 如何保证同一 key 的初始化语义;mappingFunction 为什么不应执行递归更新或长时间阻塞操作?

进阶版
来源:tencent中级工程师LinkedHashMap LRU并发安全锁粒度优化mappingFunction副作用约束ConcurrentHashMap原子操作
答案解析

ConcurrentHashMap 的 computeIfAbsent 主要解决的是并发场景下“同一个 key 只初始化一次语义”的问题。

它的语义是:如果当前 key 已经有值,就直接返回已有值;如果没有值,才会调用 mappingFunction 计算新值,并尝试放入 Map。对于同一个 key,ConcurrentHashMap 会通过桶级别的同步控制来保证并发安全。

大致流程可以这样理解:

先根据 key 计算 hash,定位到对应的桶。 如果桶为空,会通过 CAS 放入一个占位节点,表示这个 key 正在计算中,其他线程不会同时对这个桶做相同初始化。 如果桶不为空,会对桶头节点加锁,在锁内检查这个 key 是否已经存在。 如果 key 已存在,直接返回已有 value。 如果 key 不存在,才执行 mappingFunction,计算完成后把结果挂到链表或红黑树中。 如果 mappingFunction 返回 null,则不会插入任何值。

所以它保证的是:对于同一个 key,在正常情况下不会出现多个线程同时把不同的初始化结

登录后查看完整内容