ConcurrentHashMap--addCount()

本文深入探讨了Java中的ConcurrentHashMap的addCount()方法,详细解析其在并发环境下的工作原理,如何确保线程安全以及在高并发场景下的性能优势。通过对源码的分析,理解其内部的CAS操作和segment锁机制,进一步提升对Java并发编程的理解。
摘要由CSDN通过智能技术生成

===

package leetcode0606.JUC.ConcurrentHashMap;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ThreadLocalRandom;

public class _addCount {

    addCount(1L, binCount);

    private final void addCount(long x, int check) {
        /*
        check
        >=1 当前桶位 链表的长度   或者  发生冲突的位置
        =0  当前桶位的 头节点为null
        2   当前桶位为红黑树
         */

        /*
        LongAdder
         */
        //  s  当前map.table中的元素数量
        //  b  表示 LongAdder 中的base值
        //  as 表示cells数组
        ConcurrentHashMap.CounterCell[] as; long b, s;
        /*
        条件一: as = counterCells) != null
        true 表示cells数组已经初始化,当前线程使用hash去寻址找到合适的cell,去累加数据
        false 走一下个跳进
        =====================================================================================================
        条件二: !U.compareAndSwapLong(this, BASECOUNT, b = baseCount, s = b + x)
        true 说明cells数组未初始化,该线程只能去写basecount,结果失败了,即与其它线程发生了冲突,当前线程尝试去创建cells数组
        false  说明写basecount成功,不需要创建cells数组,直接退出。
         */
        if ((as = counterCells) != null ||
                !U.compareAndSwapLong(this, BASECOUNT, b = bas
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值