ConcurrentHashMap的并發(fā)度是什么?
ConcurrentHashMap的并發(fā)度就是segment的大小,默認(rèn)為16,這意味著最多同時(shí)可以有16條線程操作ConcurrentHashMap,這也是ConcurrentHashMap對(duì)Hashtable的最大優(yōu)勢(shì),任何情況下,Hashtable能同時(shí)有兩條線程獲取Hashtable中的數(shù)據(jù)嗎?
ConcurrentHashMap在jdk 1.6和jdk 1.8實(shí)現(xiàn)原理是不同的。
ConcurrentHashMap是線程安全的,但是與Hashtablea相比,實(shí)現(xiàn)線程安全的方式不同。Hashtable是通過對(duì)hash表結(jié)構(gòu)進(jìn)行鎖定,是阻塞式的,當(dāng)一個(gè)線程占有這個(gè)鎖時(shí),其他線程必須阻塞等待其釋放鎖。ConcurrentHashMap是采用分離鎖的方式,它并沒有對(duì)整個(gè)hash表進(jìn)行鎖定,而是局部鎖定,也就是說當(dāng)一個(gè)線程占有這個(gè)局部鎖時(shí),不影響其他線程對(duì)hash表其他地方的訪問。
具體實(shí)現(xiàn):ConcurrentHashMap內(nèi)部有一個(gè)Segment.
在jdk 8中,ConcurrentHashMap不再使用Segment分離鎖,而是采用一種樂觀鎖CAS算法來實(shí)現(xiàn)同步問題,但其底層還是“數(shù)組+鏈表->紅黑樹”的實(shí)現(xiàn)。