2017年11月19日

HashMap同步深入探討

前言

HashMap是常用的資料結構物件,主要利用雜湊來存放資料內容,以key-value方式來存取資料,但是HashMap本身不是一個線程安全的Collection类,所謂線性安全就當有多個執行緒在執行時,同時呼叫一個MAP,保證當有其一條執行序存取MAP物件時,其他執行序必須保證存取的值是最新的。在thread搭配hashMap使用時,會出一些問題,我們會針對這些問題做一個解析

執行序安全

在考慮執行序安全下,宣告synchronized情況下,執行時出現下列問題

(1) High CPU LOADING: 發生在hashMap 在put時候會先去檢查容量是否超過臨界點,會新增一個大的hash表,然後把老的表搬去新Map表中,這個搬動的成本很大。
High CPU  LOAD
(2) HashMap infinite loop problem: 死循環發生

HashMap與HashTable比較

(1) HashTable為同步且執行緒安全; HashMap執行緒不安全,非同步機制。
(2) HashMap 允許空建值;HashTable不允許
(3) HashTable是Dictionary的子類,HashMap是Map介面實作
(4) HashTable中hash空間大小是11,增加的方式是 old*2+1。HashMap中hash数组的空間大小是16,增加為2的指数。

ConcurrentHashMap(CHM)

ConcurrentHashMap取代HashMap同步機制,在CHM內部採用 HashEntry 和 Segment,HashEntry 用来封装映射表的键 / 值对;Segment 用来當鎖的角色。一個Segment會包含一組HashEntry健值組。

HashMap與ConcurrentHashMap比較

(1)HashMap 是non-thread safe的結構,不能在多執行緒下使用,如果需要thread safe模式須加上synchronized來使用。但是會造成一次只能有一個執行緒進入,造成其他執行緒都在排隊。
(2) ConcurrentHashMap:為thread safe的結構,讓MAP有多執行安全,可以多執行續來使用。

public class CHMTest implements  Runnable {
    Map

參考

  1. hashMap 死循環問題
  2. 聊聊并发(四)——深入分析ConcurrentHashMap