1.建構函式
2.put方法
3.get方法
類似hashtable,執行緒安全,效率高。key 和value不能為null。
資料結構上選擇了hashmap類似的陣列+鍊錶+紅黑樹的方式實現,而加鎖則採用cas和synchronized
實現。
sizectl:
sizectl 是 chm 中最重要的狀態變數,包括很多狀態
public
concurrenthashmap
(int initialcapacity,
float loadfactor,
int concurrencylevel)
long size =
(long)(
1.0d+(
double)(
(float)(
(long
)initialcapacity)
/ loadfactor));
int cap = size >=
1073741824l ?
1073741824
:tablesizefor((
int)size)
;this
.sizectl = cap;
}else
}
首先判斷鍵值對是否為null,如果null 丟擲異常。
通過key的hashcode得到hash值,該值為正數。
無線迴圈遍歷
如果當前tab為null,初始化table陣列,且返回
繼續下次遍歷,當前table陣列不為null,建立乙個node,新增進去
/** implementation for put and putifabsent */
final v putval
(k key, v value,
boolean onlyifabsent)
//表示正在擴容
elseif(
(fh = f.hash)
== moved)
tab =
helptransfer
(tab, f)
;else
//如果key不相同,向後追加資料node
node
pred = e;if(
(e = e.next)
== null)}}
else
if(f instanceof
treebin)}
else
if(f instanceof
reservationnode
)throw
newillegalstateexception
("recursive update");
}}if(bincount !=0)
}}addcount
(1l, bincount)
;return null;
}
根據sizectl判斷當前狀態,如果有執行緒正在初始化sizectl<0,讓步,如果沒有,初始化table陣列。
private
final node
inittable()
}finally
break;}
}return tab;
}
private
final
void
addcount
(long x,
int check)
if(check <=1)
return
; s =
sumcount()
;}if(check >=0)
else
if(u.
compareandswapint
(this
, sizectl, sc,
(rs << resize_stamp_shift)+2
))transfer
(tab, null)
; s =
sumcount()
;}}}
public v get
(object key)
else
if(eh <0)
return
(p = e.
find
(h, key)
)!= null ? p.val : null;
while
((e = e.next)
!= null)
}return null;
}
ConcurrentHashMap實現原理
concurrenthashmap實現原理 在jdk1.7中 concurrenthashmap是通過segment陣列 hashentry陣列 單鏈表的結構進行儲存資料。segment陣列中存放的是hashentry陣列的首位址,hashentry中存放的是乙個單鏈表 首節點位址 put 我們通過...
ConcurrentHashMap 實現原理
由於hashmap是乙個執行緒不安全的容器,主要體現在容量大於總量 負載因子發生擴容時會出現環形鍊錶從而導致死迴圈。因此需要支援執行緒安全的併發容器concurrenthashmap。如圖所示,是由segment陣列 hashentry陣列組成,和hashmap一樣,仍然是陣列加鍊表組成。concu...
ConcurrentHashMap儲存原理
concurrenthashmap是併發雜湊對映表的實現,它允許多執行緒環境完全併發讀取,並且支援16個執行緒併發更新。相對於hashtable和同步包包裝的hashmap collections.synchronizedmap new hashmap 具有更高的併發性。在hashtable和同步包...