Java并发工具题库-BB
Java并发工具题库-BB
100. JDK1.8 中 ConcurrentHashMap 的 put 过程是怎样的?
回答
JDK1.8 中的 ConcurrentHashMap 通过无锁+细粒度加锁的混合机制,实现了高效线程安全的 put 操作。整体流程是惰性初始化 + 分段插入 + 局部加锁,既兼顾并发性能,又保证数据一致性。
分析
当我们调用 put 方法时,ConcurrentHashMap 首先会判断底层桶数组(Node[] table)是否已初始化,如果尚未初始化,会触发懒加载过程。接下来根据 key 的 hash 值定位出应该落入的桶位。若目标位置为空,会尝试用 CAS 操作直接写入新的节点,这一步无需加锁,是并发安全的。
若该位置已经有节点存在,说明发生了 hash 冲突。此时需要判断当前节点结构类型:如果是链表,则对该 bin 头节点加锁,然后遍历链表,查找是否已存在相同 key,若存在则更新其值;若不存在则插入新节点。如果 bin 已经树化为红黑树,则按照红黑树的插入规则处理,同样在同步块中进行。
此外,在插入新节点后,ConcurrentHashMap 会更新总元素数量,并评估是否需要进行扩容。若达到阈值,将由当前线程或其他线程协助执行扩容逻辑,这是一种渐进式的协作扩容方式,避免阻塞。
整套机制体现了 JDK1.8 对并发控制的精细设计:尽可能用 CAS 减少锁竞争,必要时局部加锁来保持一致性,在高并发环境下能显著提升性能表现。