并发容器总结

concurrentHashMap基本数据结构

       ConcurrentHashMap在1.8中的实现,相比于1.7的版本基本上全部都变掉了。首先,取消了Segment分段锁的数据结构,取而代之的是数组+链表(红黑树)的结构。而对于锁的粒度,调整为对每个数组元素加锁(Node)(说明:Node不支持修改值,修改会抛出异常)。然后是定位节点的hash算法被简化了,这样带来的弊端是Hash冲突会加剧。因此在链表节点数量大于8时(小于6会转回链表),会将链表转化为红黑树进行存储(如果当前Node数组长度小于阈值MIN_TREEIFY_CAPACITY,默认为64,先通过扩大数组容量为原来的两倍以缓解单个链表元素过大的性能问题)。这样一来,查询的时间复杂度就会由原先的O(n)变为O(logN)。默认容量是16,可自定义初始化容量作为构造方法的参数。

并发容器总结

扩容过程

扩容过程中,正在扩容的线程会将正在转移的table节点标记为ForwardingNode,其他线程若是查找到某个节点为ForwardingNode类型节点,则查找下一个talbe节点辅助进行扩容操作,转移完一个节点,直接将该节点设置为fwd,表示已经遍历过。每个线程负责转移的数组区间最少为16,避免发生大量冲突,也就是每个线程负责连续的16个table节点的转移。nextTable指向新数组,扩容完成后nextTable置null,table指向新数组,

 

size() 方法获取当前Map中对象中的键值对个数时,返回的是估算值,不是精确值。

get()操作没有加锁,说明是弱一致性。

 

copyOnWriteArrayList