ConcurrentHashMap的put原理
时间: 2024-11-05 19:08:06 浏览: 73
`ConcurrentHashMap`是`java.util.concurrent`包下的一个线程安全的哈希表实现,其`put`操作的核心原理基于红黑树和哈希表的结合:
1. **哈希表基础**:当尝试将键值对添加到`ConcurrentHashMap`时,首先会通过哈希函数计算出键的哈希码,然后根据这个哈希码确定存储位置。这一步非常快,因为它依赖于内存地址的计算。
2. **碰撞处理**:由于哈希函数不可能保证每个键都能得到唯一的槽位,所以可能会发生冲突(碰撞)。对于大多数哈希算法,如果两个键哈希到同一个槽位,就会形成链表,即所谓的开放寻址法。
3. **锁分离**:`ConcurrentHashMap`的设计允许并发地对不同桶进行操作。它使用分段锁(Segmented Locking)机制,每个桶对应一个独立的锁。这意味着当你在某个桶上添加元素时,其他桶上的操作可以继续,提高了并发性能。
4. **插入红黑树**:当链表长度超过8(这是内部设计的阈值),`ConcurrentHashMap`会切换到红黑树结构。此时,插入新元素不再直接追加到链表尾部,而是作为新节点插入红黑树中,保持树的平衡。插入操作会在树中进行,同时维护红黑树的性质(如颜色、度数等)。
5. **最终同步**:为了保证数据的一致性,当所有相关的修改完成后,可能会触发最终同步(Flush),比如删除了最后一个节点导致整个桶变为空或者红黑树转换回链表。这个过程会被加锁,确保在此期间线程安全。
总之,`ConcurrentHashMap.put`操作巧妙地利用了哈希表的快速查找和红黑树的高效排序,实现了高效的并发插入,并通过锁分离策略避免了全局互斥。
阅读全文
相关推荐


















