currenthashmap在jdk1.8扩容处理逻辑是什么
时间: 2024-01-24 19:20:16 浏览: 17
在 JDK 1.8 中,`ConcurrentHashMap` 中的扩容处理逻辑与之前的版本有所不同。在 JDK 1.8 中,`ConcurrentHashMap` 使用了一种称为“分段锁”的技术,即将整个哈希表分成多个段,每个段都有一个独立的锁,这样不同的线程可以同时访问不同的段,从而提高了并发性能。
在扩容时,`ConcurrentHashMap` 会先将整个哈希表分成多个段,然后对每个段进行扩容。具体的处理逻辑如下:
1. 首先,`ConcurrentHashMap` 会计算新哈希表的大小,然后创建一个新的哈希表数组。
2. 然后,`ConcurrentHashMap` 会对每个段进行扩容。对于每个段,`ConcurrentHashMap` 会获取该段的锁,以确保在扩容过程中不会有其他线程修改该段。
3. 在获取到锁之后,`ConcurrentHashMap` 会将该段中的所有键值对复制到新的哈希表中。在复制过程中,`ConcurrentHashMap` 会使用一种称为“链表分裂”的技术,即将每个桶中的链表分成两个链表,一个是原链表中哈希值不变的键值对构成的链表,另一个是哈希值变化的键值对构成的链表。
4. 复制完成后,`ConcurrentHashMap` 会将新的哈希表赋值给该段的哈希表属性,并释放该段的锁。
5. 最后,`ConcurrentHashMap` 会对整个哈希表进行扩容完成的检查,以确保在扩容过程中没有其他线程修改了哈希表。
需要注意的是,在 JDK 1.8 中,`ConcurrentHashMap` 的扩容操作是分段进行的,因此扩容的过程不会对整个哈希表进行加锁,从而减小了锁的争用,提高了并发性能。