Segment段
ConcurrentHashMap和HashMap底层思路是差不多的,但因为它支持并发操作,所以要复杂一些。整个ConcurrentHashMap由一个个Segment组成,Segment代表部分或一段的意思,所以很多时候描述其为分段锁。注:下文中的槽代表一个Segment。
线程安全(Segment继承ReentrantLock)
简单理解就是,ConcurrentHashMap是一个Segment数组,Segment通过继承ReentrantLock来进行加锁,所以每次需要加锁锁住的是一个Segment,这样只要保证每个Segment是线程安全的,也就实现了全局的线程安全。
并行度(默认16)
concurrencyLevel:并行级别、并发数、Segment数,默认为16,也就是说ConcurrentHashMap有16个Segments,理论上,这时候可以同时支持16个线程并发读写,只要他的操作位于不同的Segment上,这个值可以在初始化的时候为其设置初始化值,但是一旦初始化后,它是不可以扩容的。具体到每个Segment内部,其实每个Segment内部像一个HashMap,不过他要保证线程安全,处理起来相对麻烦。
Java8实现(引入红黑树)
Java8对ConcurrentHashMap进行了比较大的改动,引入了红黑树。