1.ConcurrentHashMap
无论是1.7还是1.8,都能看出JDK没有对HashMap做任何的同步操作,所以并发会出问题,甚至 1.7 中出现死循环导致系统不可用(1.8 已经修复死循环问题)。因此JDK推出了ConcurrentHashMa,专门用于解决并发问题。
ConcurrentHashMap同样也分为1.7 、1.8版,两者在实现上略有不同。
2.Base 1.7
先来看看 1.7 的实现,下面是他的结构图:
ConcurrentHashMap由Segment数组(segment:段、部分)和HashEntry组成,和HashMap一样,仍然是数组加链表。
它的核心成员变量:
final Segment<K,V>[] segments; //Segment数组,存放数据时首先需要定位到具体的Segment中
transient Set<K> keySet;
transient Set<Map.Entry<K,V>> entrySet;
Segment是ConcurrentHashMap的一个内部类,主要的组成如下:
static final class Segment<K,V> extends ReentrantLock implements Serializable {
private static final long serialVersionUID = 2249069246763182397L;
transient volatile HashEntry<K,V>[] table; //和HashMap中的HashEntry作用一样,真正存放数据的桶
transient int count;
transient int modCount;
transient int threshold;
final float loadFactor;
}
HashEntry的组成:
和HashMap非常类似&#x