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