當前位置:成語大全網 - 書法字典 - HashMap、HashTable和ConcurrentHashMap的原理和區別

HashMap、HashTable和ConcurrentHashMap的原理和區別

從類圖中可以看出,ConcurrentHashMap在存儲結構上比HashMap多了壹個類段。ConcurrentHashMap由段數組結構和HashEntry數組結構組成。Segment是壹個ReentrantLock,在ConcurrentHashMap中扮演鎖的角色。HashEntry用於存儲鍵值對數據。ConcurrentHashMap包含壹個段數組。Segment的結構類似於HashMap,是壹種數組和鏈表結構。壹個段包含壹個HashEntry數組,每個HashEntry是壹個鏈表結構的元素,每個段守護壹個HashEntry數組中的元素。修改HashEntry數組的數據時,必須先獲取與之對應的段鎖。

ConcurrentHashMap使用鎖分段技術來確保線程安全。

鎖分段技術:首先將數據分段存儲,然後給每段數據分配壹個鎖。當壹個線程占用鎖訪問壹段數據時,其他段的數據也可以被其他線程訪問。

ConcurrentHashMap提供了與Hashtable和SynchronizedMap不同的鎖定機制。Hashtable中使用的鎖定機制是壹次性鎖定整個哈希表,這樣同壹時間只有壹個線程可以操作;然而,在ConcurrentHashMap中,壹次只能鎖定壹個桶。

哈希表容器在高度競爭的並發環境中效率低下的原因是所有訪問哈希表的線程必須競爭同壹個鎖。如果容器中有多個鎖,每個鎖用於鎖定容器中的部分數據,那麽當多個線程訪問容器中不同數據段的數據時,線程之間就不會發生鎖競爭,可以有效提高並發訪問的效率。這是ConcurrentHashMap使用的鎖分段技術。首先,數據存儲在數據段中,然後為每個數據段分配壹個鎖。當壹個線程占用鎖訪問壹段數據時,其他段的數據也可以被其他線程訪問。