3、些写操作都非常平均地分布在所有的Segment上),所以,通过这一种结构,ConcurrentHashMap的并发能力可以大大的提高。Segment我们再来具体了解一下Segment的数据结构: Java代码 1.static final class Segment extends ReentrantLock implements Serializable { 2. transient volatile int count; 3. transient int modCount; 4. transient int threshold; 5. trans
4、ient volatile HashEntry[] table; 6. final float loadFactor; 7.} 详细解释一下Segment里面的成员变量的意义:·count:Segment中元素的数量·modCount:对table的大小造成影响的操作的数量(比如put或者remove操作)·threshold:阈值,Segment里面元素的数量超过这个值依旧就会对Segment进行扩容·table:链表数组,数组中的每一个元素代表了一个链表的头部·loadFactor:负载因子,用于确定thresholdHashEntrySegment中的元素是以H
5、ashEntry的形式存放在链表数组中的,看一下HashEntry的结构: Java代码 1.static final class HashEntry { 2. final K key; 3. final int hash; 4. volatile V value; 5. final HashEntry next; 6.} 可以看到HashEntry的一个特点,除了value以外,其他的几个变量都是final的,这样做是为了防止链表结构被破坏,出现ConcurrentModification的情况。ConcurrentHashMap的
6、初始化下面我们来结合源代码来具体分析一下ConcurrentHashMap的实现,先看下初始化方法: Java代码 1.public ConcurrentHashMap(int initialCapacity, 2. float loadFactor, int concurrencyLevel) { 3. if (!(loadFactor > 0)
7、
8、 initialCapacity < 0
9、
10、 concurrencyLevel <= 0) 4. throw new IllegalArgumentException
11、(); 5. 6. if (concurrencyLevel > MAX_SEGMENTS) 7. concurrencyLevel = MAX_SEGMENTS; 8. 9. // Find power-of-two sizes best matching arguments 10. int sshift = 0; 11. int ssize = 1;