HashMap是非線程安全的臼膏,因此java的集合框架中提供了線程安全的map,就是ConcurrentHashMap;ConcurrentHashMap由一個個的Segment組成暖庄,也稱為分段鎖。而ConcurrentHashMap之所以是線程安全的楼肪,是因為Segment繼承了ReentrantLock來進(jìn)行加鎖培廓,所以每次加鎖都會鎖住一個Segment,這樣就可以保證每一個Segment是線程安全的春叫,進(jìn)而也就實現(xiàn)了整體的線程安全肩钠。創(chuàng)建ConcurrentHashMap時俘侠,默認(rèn)有16個Segment,因此理論上可以同時支持16個線程的并發(fā)寫蔬将,前提是這些寫操作發(fā)生在不同的Segment上爷速。這個16我們稱為并發(fā)度,可以在創(chuàng)建時指定霞怀,但是一旦指定就無法再進(jìn)行改變惫东。
下圖是Java7中ConcurrentHashMap的數(shù)據(jù)結(jié)構(gòu)示意圖。
和HashMap類似毙石,Java8中ConcurrentHashMap也引入了紅黑樹廉沮,保證了鏈表長度太長進(jìn)行轉(zhuǎn)換,降低查詢復(fù)雜度徐矩。