🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### ConcurrentHashMap > CAS + synchronized 控制并发操作 #### sizeCtl > 0 默认值 > -1 代表正在初始化 > >0 表示阈(yu)值 > < -1 多个线程正在进行扩容 #### 与hashMap区别 > 初始化:使用CAS的保证只有一个线程能进行初始化 > 增加元素:如果桶是空的,通过CAS放入新值 > 如果发现正在扩容,则需要帮助扩容 > 帮助扩容的时候,需要判断当前桶是不是正在扩容,如果不是的话, > 如果桶不是空的,锁住桶的头节点,开始插入;再分是链表还是红黑树。 1. 当 Cmap 尝试插入的时候,发现该节点是 forward 类型,则会帮助其扩容。 2. 每次加入一个线程都会将 sizeCtl 的低 16 位加一。同时会校验高 16 位的标示符。 3. 扩容最大的帮助线程是 65535,这是低 16 位的最大值限制的。 4. 每个线程默认分配 16 个桶,如果桶的数量是 16,那么第二个线程无法帮助其扩容。