在JDK1.5~1.7版本,Java使用了分段鎖機(jī)制實(shí)現(xiàn)ConcurrentHashMap。
簡(jiǎn)而言之,ConcurrentHashMap在對(duì)象中保存了一個(gè)Segment數(shù)組,即將整個(gè)Hash表劃分為多個(gè)分段;而每個(gè)Segment元素,它通過繼承 ReentrantLock 來進(jìn)行加鎖,所以每次需要加鎖的操作鎖住的是一個(gè) segment,這樣只要保證每個(gè) Segment 是線程安全的,也就實(shí)現(xiàn)了全局的線程安全;這樣,在執(zhí)行put操作時(shí)首先根據(jù)hash算法定位到元素屬于哪個(gè)Segment,然后對(duì)該Segment加鎖即可。因此,ConcurrentHashMap在多線程并發(fā)編程中可是實(shí)現(xiàn)多線程put操作。
concurrencyLevel: Segment 數(shù)(并行級(jí)別、并發(fā)數(shù))。默認(rèn)是 16,也就是說 ConcurrentHashMap 有 16 個(gè) Segments,所以理論上,這個(gè)時(shí)候,最多可以同時(shí)支持 16 個(gè)線程并發(fā)寫,只要它們的操作分別分布在不同的 Segment 上。這個(gè)值可以在初始化的時(shí)候設(shè)置為其他值,但是一旦初始化以后,它是不可以擴(kuò)容的。