ConcurrentHashMap的原理分析

1)ConcurrentHashMap的原理分析
    (1)Collections.SynchronizedMap: 把不安全的集合变为不安全的

    (2)2个API
        put:putVal

        get

    (3)Spring Bean

    (4)怎么去解决并发安全的问题的: 并发安全 + 效率

    (5)分段锁:1.7
        1.8: 变化1:取消分段segment     变化2:数组+单向链表--》数组+单向链表+红黑树 

    (6)表转树的原因:  1.检索快


    (7)思考1000个元素存入HashMap的过程:
            1.默认分配16个数组,一个元素计算一下,看落到哪个地方了,如果冲突落到了同一个位置,就形成一个单向链表。
            2.红黑树: 节点要么是红色,要么是黑色。 链长度》8,数组长度》64的时候,就会把 链表--》红黑树。  反之,从 红黑树-》链表
            3.sizeCtl:
                考虑initTable,如果10个线程都进来会怎样?
                volatile 的 写 一定 happen-before 读
            4.并发非常高的时候,cas不可行。 atomic也是一种cas,并发量非常高的时候,都在for循环cas,比较占用资源。
                    因此采用分段cas
            5.加锁--》性能也会下降
                addCount

    (8)分片、分而治之

    (9)扩容: 可以多线程投并行扩容  
          高16位:  扩容标记
          低16位: 扩容线程数

          需要保证每次扩容的扩容戳都是唯一的。 因此可以支持并发扩容。

          分段处理的思想。

    (10)CHM的设计思想     
          1.通过数组的方式来实现并发增加元素的个数。
          2.并发扩容,可以通过多个线程来并行实现数据的迁移。
          3.采用高低链的方式来解决多次hash计算的问题。
          4.sizeCtl的设计,3表示状态。
          5.resizeStamp的设计,高低位的设计来实现唯一性以及多个线程的协助扩容记录。

2)红黑树的基本原理
    1.高低位 transfer

    2.红黑树
        treeifyBin: 要么扩容处理,要么就转化为红黑树。

        二叉查找树:左子节点 《 根节点 《 右子节点。

        10--》11--》12--》13.。。假如一直这样极端情况,就成一条链了。

        红黑树也是平衡二叉树,且满足5个条件。

        当加入一个节点导致:当前这棵树不满足条件时,就会采取左旋或者右旋,并重新着色的方式,重新达到平衡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值