ConcurrentHashMap(CHM)是Java為解決高并發場景下哈希表性能瓶頸而設計的線程安全容器,其核心目標在于:
- 線程安全?:避免多線程操作導致的數據不一致問題?;
- 高吞吐量?:通過細粒度鎖和無鎖化設計降低線程競爭?;
- 動態擴展?:支持自動擴容與數據結構優化(如鏈表轉紅黑樹)?;
下面我們一起詳細看看ConcurrentHashMap的細節是什么樣的
一、ConcurrentHashMap 概述
?ConcurrentHashMap(CHM)? 是 Java 并發包中實現線程安全的哈希表,其核心設計目標是?在高并發場景下兼顧性能與線程安全?。與 HashTable 的全表鎖不同,CHM 通過?分段鎖(JDK7)?和?CAS+synchronized細粒度鎖(JDK8+)? 實現高效并發控制,解決了傳統同步容器的性能瓶頸?。
二、核心工作原理
2.1 數據結構的演進
1)JDK7 分段鎖機制?
- 采用 ?Segment 數組 + HashEntry 鏈表? 的二級結構,每個 Segment 繼承 ReentrantLock,獨立管理一個子哈希表。?
- 鎖粒度?:以 Segment 為鎖單位,不同 Segment 的寫操作可并行?。?
- 缺點?:Segment 數量固定(默認16),擴容僅針對單個 Segment,無法全局動態調整?。
2)?JDK8+ 優化設計?
- Node 數組 + 鏈表/紅黑樹?:取消 Segment,直接使用 Node 數組,鏈表長度超過8時轉為紅黑樹(避免哈希沖突導致的性能退化)?。
- 鎖粒度細化?:僅對單個桶(Node 數組元素)加鎖(通過 synchronized 和 CAS),并發度更高?。
具體版本對比如下
2.2 線程安全機制
1)CAS(Compare And Swap)?:用于無鎖化更新頭節點、統計元素數量(如 sizeCtl)等場景,減少線程阻塞?。
2?)Synchronized 鎖?:針對具體桶(Node)加鎖,僅當哈希沖突時觸發,避免全局鎖競爭?。
?3)Volatile 變量?:保證內存可見性,如 Node.val 和 next 指針均用 volatile 修飾?。
2.3 JDK8實現原理和源碼解析
1)核心數據結構
// Node節點定義(鏈表結構)
static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; volatile V val; // 保證可見性 volatile Node<K,V> next; // 保證可見性 // ...
} // TreeNode節點(紅黑樹結構)
static final class TreeNode<K,V> extends Node<K,V> { TreeNode<K,V> parent; TreeNode<K,V> left; TreeNode<K,V> right; TreeNode<K,V> prev; boolean red;
}
設計要點?:
- volatile修飾?:val和next字段確保內存可見性?;
- 樹化