JavaGuide项目解析:ConcurrentHashMap 1.7中rehash方法的双循环设计
在Java并发编程中,ConcurrentHashMap是一个非常重要的线程安全哈希表实现。在JDK 1.7版本中,其内部实现采用了分段锁机制来保证线程安全。其中rehash方法是扩容过程中的核心操作,而它内部采用的两个for循环设计体现了Doug Lea大师对并发性能优化的精妙思考。
rehash方法的基本原理
当ConcurrentHashMap中的某个段(Segment)需要扩容时,会触发rehash操作。这个过程会将旧表中的元素重新分配到新表中。在JDK 1.7的实现中,rehash方法采用了两个for循环的设计,这种设计并非偶然,而是经过深思熟虑的性能优化方案。
第一个for循环:定位lastRun节点
第一个for循环的主要目的是找到链表中最后一个不需要移动位置的节点(lastRun)。这个节点及其后续节点在新表中的位置是相同的,因此可以整体迁移而不需要逐个节点处理。
HashEntry<K,V> lastRun = e;
int lastIdx = idx;
for (HashEntry<K,V> p = e.next; p != null; p = p.next) {
int k = p.hash & sizeMask;
if (k != lastIdx) {
lastIdx = k;
lastRun = p;
}
}
这个循环从当前节点开始遍历链表,记录下最后一个位置不变的节点。统计表明,在默认阈值下,当表容量加倍时,只有大约六分之一的节点需要被克隆,这大大减少了对象创建的开销。
第二个for循环:节点迁移
第二个for循环负责实际的数据迁移工作。它将需要移动位置的节点复制到新表中,同时保持原有节点的引用不变:
for (HashEntry<K,V> p = e; p != lastRun; p = p.next) {
V v = p.value;
int h = p.hash;
int k = h & sizeMask;
HashEntry<K,V> n = newTable[k];
newTable[k] = new HashEntry<K,V>(h, p.key, v, n);
}
这里的关键点是每次都创建新的HashEntry对象,而不是复用原有对象。这种设计保证了并发读取线程的遍历操作不会因为扩容而中断,原有链表结构保持不变。
并发安全的设计哲学
这种双循环设计体现了ConcurrentHashMap的一个重要设计原则:写操作不影响读操作。通过创建新节点而不是修改现有节点,保证了:
- 正在遍历的线程可以继续安全地访问旧链表
- 新写入的数据会进入新创建的节点
- 旧节点在没有线程引用后会被垃圾回收
这种"写时复制"的思想在并发编程中非常常见,它牺牲了一定的内存使用效率,换来了更高的并发读取性能。
性能优化考量
双循环设计在性能方面的优化体现在:
- 减少了对象创建数量:通过lastRun优化,大部分节点可以整体迁移
- 降低了锁竞争:扩容操作只影响当前段,其他段仍可正常访问
- 平衡了内存开销和并发性能:只在必要时创建新对象
这种设计在并发性和性能之间取得了很好的平衡,是ConcurrentHashMap能够高效支持高并发场景的关键之一。
总结
ConcurrentHashMap 1.7中rehash方法的双循环设计展示了Java并发大师对性能优化的极致追求。通过精妙的数据结构和算法设计,在保证线程安全的同时,最大限度地提高了并发性能。理解这种设计思想,对于开发高性能并发程序有着重要的指导意义。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00