ConcurrentHashMap 源码

1、一个栏位(hashmap数组的一个位置),放置的node有这几种可能:A----null;B----链表的头节点,这是的hash值和后继节点的hash值是一样的,而且和数组位置也是一一对应的,是个正数;C----transfer中,会把hash值为-1(MOVED)的一个firstNode放在这里,标志这个位置正在被transfer;D----红黑树的TreeBin,继承了Node,构造函数中给Node的hash值赋值-2. 所以综合来说,可以根据头节点的hash值判断当前栏位的情况。

2、ConcurrentHashMap 是一个线程安全的数据结构,要解决两个不安全的地方:读写冲突,和写写(增删改)冲突。读是不加锁的,这点很厉害,也挺有意思值得研究。

  A:transfer的时候,不是像hashmap那样对一个链表进行拆分,这样会导致读的时候一路next的时候出现断裂,而是保持原先的链式数据结构不变,扩容后的两个栏位,对之前的链表进行分别引用。(红黑树的情况呢?在红黑树调整的时候,如果正在查找,会不会出现连接断掉的情况?)

猜你喜欢

转载自www.cnblogs.com/chuliang/p/9492569.html
今日推荐