ConcurrentHashMap JDK1.8 源码

put:
检查key或value是否为空,如果key或value为空,则抛异常,反之进入for死循环,
    检查table是否初始化了,如果没有,则进行初始化(初始化完成后进行下一次循环),如果已经初始化则根据key找到hash表中索引位置table[i],
        如果没有发生碰撞,则利用CAS操作直接存储在table[i],如果成功则退出循环,反之进行下一次循环
        如果发生碰撞,检查table[i]的节点的hash是否等于MOVED(-1),
           如果等于,则检测到正在扩容,则帮助其扩容(扩容完成后进行下一次循环)
           如果没扩容,用synchronized锁定该索引位置的结点,(hash值相同的链表的头节点)
             如果是链表节点,key存在则修改,key不存在则插入链表尾部,如果链表结点数大于等于8则转化为红黑树
             如果是红黑树节点,key存在则修改,key不存在则插入树中         
get:
根据key计算在table出现的位置i.
如果table为空或者table[i]为空,返回空,
反之如果table[i]的头结点的key满足条件,是则返回头结点的value;否则分别根据树、链表查询。 

https://blog.csdn.net/u010723709/article/details/48007881

https://blog.csdn.net/u010412719/article/details/52145145

https://www.jianshu.com/p/d10256f0ebea

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/89326951