ConcurrentHashMap 是 Java 中一个线程安全的 HashMap 实现,它采用了分段锁技术(在 Java 8 之后采用了更高效的锁分离技术)来实现高并发访问。ConcurrentHashMap 的扩容机制主要包括以下几个步骤:
确定扩容时机:当 ConcurrentHashMap 中的元素数量达到一定阈值时(默认为容量 * 加载因子,例如默认容量为 16,加载因子为 0.75,则阈值为 12),就会触发扩容操作。
计算新的容量:扩容时,ConcurrentHashMap 会将原有的容量翻倍,以容纳更多的元素。
初始化新的 Node 数组:根据新的容量创建一个新的 Node 数组,用于存放扩容后的元素。
复制元素:将原有的元素复制到新的 Node 数组中。这个过程是并发进行的,每个线程负责复制一部分元素。为了保证数据一致性,ConcurrentHashMap 使用了一种称为 “转移”(transfer)的技术,将原有数组中的元素复制到新数组中,同时保持原有数组不变。这样,在扩容过程中,其他线程仍然可以访问原有数组中的数据。
完成扩容:当所有线程完成元素复制后,新的 Node 数组将替换原有数组,从而完成扩容操作。
需要注意的是,ConcurrentHashMap 的扩容过程是一个并发操作,它允许其他线程在扩容过程中继续访问和修改 ConcurrentHashMap。这是通过在扩容过程中使用 “转移” 技术和原子操作来实现的。这种设计使得 ConcurrentHashMap 在高并发场景下具有较好的性能表现。