currentHashMap是怎么扩容的
时间: 2023-11-07 17:57:31 浏览: 72
ConcurrentHashMap的扩容过程相较于JDK1.6中的分段锁设计有了很大的改进。在JDK1.8中,ConcurrentHashMap采用了一种全新的扩容策略,即将原有的Segment分割成更小的单元,称为Node。在扩容过程中,ConcurrentHashMap会创建一个新的Node数组,长度为原来的两倍,并将原有的Node节点重新分配到新的数组中。这个过程是非常高效的,并且不会影响到其他正在进行的操作。具体的扩容过程可以参考引用和引用提供的详细解释。
相关问题
currentHashMap的扩容机制
ConcurrentHashMap 是 Java 中的一个线程安全的哈希表实现,它支持高并发的读写操作。在并发环境下,ConcurrentHashMap 的扩容机制是通过分段锁(Segment)来实现的。
ConcurrentHashMap 内部被划分为一系列的段(Segment),每个段都是一个独立的哈希表(HashEntry[]),并且每个段都拥有自己的锁。当需要扩容时,只会对其中一个段进行扩容操作,而其他段仍然可以被并发地访问。
具体的扩容过程如下:
1. 首先,ConcurrentHashMap 会创建一个新的哈希表,大小是当前表的两倍。
2. 然后,它会遍历每个段的链表,将节点(Entry)重新分配到新的哈希表中。这个过程是并发进行的,因为每个段都有自己的锁,所以其他段仍然可以被并发地访问。
3. 在节点重新分配过程中,如果两个节点哈希到了新表的同一个位置,会采用链表的方式进行存储。如果链表长度超过了一定阈值(默认是8),就会触发红黑树(TreeBin)的转化操作,将链表转化为红黑树,提高查询效率。
4. 最后,当所有节点都被重新分配完毕后,所有的段都会指向新的哈希表。这个过程是原子性的,因为在修改段指向的同时,其他线程仍然可以读取旧的哈希表进行操作。
这种分段锁的扩容机制有效地减少了并发写操作的竞争,并提高了并发读操作的性能。同时,它还保证了并发访问时的线程安全性。
currentHashMap1.8扩容原理
ConcurrentHashMap 1.8 的扩容是基于 JDK 1.7 的实现进行优化的。
在 JDK 1.7 中,ConcurrentHashMap 的扩容是通过分段锁来实现的。具体来说,ConcurrentHashMap 会将其内部数据结构(Segment 数组)分成若干个段(Segment),每个段都有一个独立的锁。在扩容时,只需要对需要扩容的段加锁,其他段仍然可以正常读写,从而实现了并发扩容。
而在 JDK 1.8 中,ConcurrentHashMap 改为了使用 CAS 原子操作来实现扩容。它会先将整个 ConcurrentHashMap 分成若干个桶(table),每个桶中存储多个键值对。当需要扩容时,先创建一个新的桶数组,并将每个桶中的键值对重新计算 Hash 后,放入新的桶数组中。在放入新桶数组的过程中,通过 CAS 操作来保证线程安全。扩容完成后,新的桶数组会替换旧的桶数组,从而完成整个扩容过程。
需要注意的是,在扩容时,ConcurrentHashMap 会将每个桶中的键值对分拆成两个链表,分别放入新旧两个桶数组中。这是为了防止在扩容过程中,某个桶中的所有键值对都需要重新计算 Hash 的情况,从而导致大量的链表重建,影响扩容效率。
阅读全文