ConcurrentHashMap的实现
ConcurrentHashMap在内部分为若干个小的HashMap,称为数据段(Segment)。在默认情况下,一个ConcurrentHashMap被细分为16个数据段,对每个数据段都单独进行加锁操作。Segment的个数=锁的并发度
ConcurrentHashMap是由Segment数组和HashEntry数组组成的。Segment继承了可重入锁(ReentrantLock),它在ConcurrentHashMap中扮演锁的角色。HashEntry则用于存储键值对数据。
在每一个ConcurrentHashMap中都包含一个Segment数组,Segment的结构是数组和链表结构。在每个Segment里都包含一个HashEntry数组,每个HashEntry都是一个链表结构的数据,每个Segment都守护一个HashEntry数组里的元素,在对HashEntry数组的数据进行修改时,必须首先获得对应的Segment锁。
在操作ConcurrentHashMap时,如果需要在其中添加一个新的数据,应先根据HashCode查询该数据应该被存在那个数据段,然后对该段数据加锁并完成put操作。在多线程环境下,如果多个线程同时进行put操作,则只要加入的数据被存放在不同的Segment中,在线程间就可以做到并行的线程安全。