跳到主要內容

發表文章

目前顯示的是 11月, 2017的文章

HashMap同步深入探討

前言 HashMap是常用的資料結構物件,主要利用雜湊來存放資料內容,以key-value方式來存取資料,但是HashMap本身不是一個線程安全的Collection类,所謂線性安全就當有多個執行緒在執行時,同時呼叫一個MAP,保證當有其一條執行序存取MAP物件時,其他執行序必須保證存取的值是最新的。在thread搭配hashMap使用時,會出一些問題,我們會針對這些問題做一個解析 執行序安全 在考慮執行序安全下,宣告synchronized情況下,執行時出現下列問題 (1) High CPU LOADING: 發生在hashMap 在put時候會先去檢查容量是否超過臨界點,會新增一個大的hash表,然後把老的表搬去新Map表中,這個搬動的成本很大。 (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 impleme...