HashMap是非线程安全的,因此java的集合框架中提供了线程安全的map,就是ConcurrentHashMap;ConcurrentHashMap由一个个的Segment组成,也称为分段锁。而ConcurrentHashMap之所以是线程安全的,是因为Segment继承了ReentrantLock来进行加锁,所以每次加锁都会锁住一个Segment,这样就可以保证每一个Segment是线程安全的,进而也就实现了整体的线程安全。创建ConcurrentHashMap时,默认有16个Segment,因此理论上可以同时支持16个线程的并发写,前提是这些写操作发生在不同的Segment上。这个16我们称为并发度,可以在创建时指定,但是一旦指定就无法再进行改变。
下图是Java7中ConcurrentHashMap的数据结构示意图。
和HashMap类似,Java8中ConcurrentHashMap也引入了红黑树,保证了链表长度太长进行转换,降低查询复杂度。