ConcurrentHashMap和HashMap和HashTable

来源:互联网 发布:如何评价王毅 知乎 编辑:程序博客网 时间:2024/06/09 13:09

ConcurrentHashMap

它包含了一个Segment数组,每个Segment包含一个HashEntity数组,加锁时候是加在Segment对象上

构造函数:

 public ConcurrentHashMap() {        this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);// }

DEFAULT_INITIAL_CAPACITY和DEFAULT_CONCURRENCY_LEVEL默认为16
DEFAULT_LOAD_FACTOR 默认加载因子为0.75

调用的是下边这个构造函数

public ConcurrentHashMap(int initialCapacity,                             float loadFactor, int concurrencyLevel) {//        if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)            throw new IllegalArgumentException();        if (concurrencyLevel > MAX_SEGMENTS)            concurrencyLevel = MAX_SEGMENTS;        // Find power-of-two sizes best matching arguments        int sshift = 0;        int ssize = 1;        while (ssize < concurrencyLevel) {            ++sshift;            ssize <<= 1;//左移一位        }        segmentShift = 32 - sshift;        segmentMask = ssize - 1;        this.segments = Segment.newArray(ssize);//初始化数组长度ssize等于16        if (initialCapacity > MAXIMUM_CAPACITY)            initialCapacity = MAXIMUM_CAPACITY;        int c = initialCapacity / ssize;        if (c * ssize < initialCapacity)            ++c;        int cap = 1;        while (cap < c)            cap <<= 1;        for (int i = 0; i < this.segments.length; ++i)            this.segments[i] = new Segment<K,V>(cap, loadFactor);//初始化数组元素 cap是初始数组长度为1 ,loadFactor是加载因子为0.75    }



看下:

Segment
主要元素

 transient volatile HashEntry<K,V>[] table;

 构造方法:

  Segment(int initialCapacity, float lf) {  //加载因子传多少都没用,默认是1f            loadFactor = lf;            setTable(HashEntry.<K,V>newArray(initialCapacity)); //根据长度初始化数组        }


看看ConcurrentHashMap的内部类HashEntity:

static final class HashEntry<K,V> {        final K key;        final int hash;        volatile V value;//保证修改value时候对多线程的可见性        final HashEntry<K,V> next;        HashEntry(K key, int hash, HashEntry<K,V> next, V value) {            this.key = key;            this.hash = hash;            this.next = next;            this.value = value;        }@SuppressWarnings("unchecked")static final <K,V> HashEntry<K,V>[] newArray(int i) {    return new HashEntry[i];}    }
是不是跟HashMap的内部类Entity一样

整体结构如下

 


参考:http://ifeve.com/concurrenthashmap/

阅读全文
0 0