古詩詞大全網 - 成語大全 - HashMap、HashTable、ConcurrentHashMap的原理與區別

HashMap、HashTable、ConcurrentHashMap的原理與區別

從類圖中可以看出來在存儲結構中ConcurrentHashMap比HashMap多出了壹個類Segment。 ConcurrentHashMap是由Segment數組結構和HashEntry數組結構組成。Segment是壹個可重入鎖(ReentrantLock),在ConcurrentHashMap裏扮演鎖的角色;HashEntry則用於存儲鍵值對數據。壹個ConcurrentHashMap裏包含壹個Segment數組。Segment的結構和HashMap類似,是壹種數組和鏈表結構。壹個Segment裏包含壹個HashEntry數組,每個HashEntry是壹個鏈表結構的元素,每個Segment守護著壹個HashEntry數組裏的元素。當對HashEntry數組的數據進行修改時,必須首先獲得與它對應的segment鎖。

ConcurrentHashMap是使用了鎖分段技術來保證線程安全的。

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

ConcurrentHashMap提供了與Hashtable和SynchronizedMap不同的鎖機制。Hashtable中采用的鎖機制是壹次鎖住整個hash表,從而在同壹時刻只能由壹個線程對其進行操作;而ConcurrentHashMap中則是壹次鎖住壹個桶。

Hashtable容器在競爭激烈的並發環境下表現出效率低下的原因是因為所有訪問Hashtable的線程都必須競爭同壹把鎖,假如容器裏有多把鎖,每壹把鎖用於鎖容器其中壹部分數據,那麽當多線程訪問容器裏不同數據段的數據時,線程間就不會存在鎖競爭,從而可以有效提高並發訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術。首先將數據分成壹段壹段存儲,然後給每壹段數據配壹把鎖,當壹個線程占用鎖訪問其中壹個段數據的時候,其它段的數據也能被其它線程訪問。