Java多线程——LongAdder(jdk1.8新增)源码分析

本文详细分析了Java 1.8中LongAdder的实现原理,包括其成员变量如cells、cellsBusy和base的作用,以及add和longAccumulate方法的工作流程。LongAdder通过cells数组分散线程竞争,提高并发性能,适用于高并发计数场景。
摘要由CSDN通过智能技术生成

目录

1.类的定义以及重要字段解析

1.1 成员变量cells

1.2 成员变量cellsBusy

1.3 成员变量base

2.方法详解

2.1 add方法详解

2.2 longAccumulate方法详解

3.hash的生成详解

4.总结


1.类的定义以及重要字段解析

上面的LongAdder 的定义结构看该类实现了Striped64 抽象类。

Striped64类如下:

上述三个属性详解如下:

   //用于存放cell的hash表,大小是2的幂次方	
    transient volatile Cell[] cells;	
  	
   //基础值	
   //1. 在没有竞争时会更新这个值;	
   //2. 在cells初始化的过程中,cells处于不可用的状态,这时候也会尝试将通过cas操作值累加到base。	
    transient volatile long base;	
    //自旋锁,通过CAS操作加锁,用于保护创建或者扩展Cell表。	
    transient volatile int cellsBusy;

1.1 成员变量cells

cells数组是LongAdder高性能实现的必杀器: 

  • AtomicInteger只有一个value,所有线程累加都要通过cas竞争value这一个变量,高并发下线程争用非常严重; 
  • 而LongAdder则有两个值用于累加,
    • 一个是base,它的作用类似于AtomicInteger里面的value,在没有竞争的情况不会用到cells数组,它为null,这时使用base做累加,
    • 有了竞争后cells数组就上场了,第一次初始化长度为2,以后每次扩容都是变为原来的两倍,直到cells数组的长度大于等于当前服务器cpu的数量为止就不在扩容;每个线程会通过线程对cells[threadLocalRandomProbe%cells.length]位置的Cell对象中的value做累加,这样相当于将线程绑定到了cells中的某个cell对象上;

1.2 成员变量cellsBusy

cellsBusy,它有两个值0 或1,

  • 它的作用是当要修改cells数组时加锁,防止多线程同时修改cells数组,0为无锁,1为加锁,加锁的状况有三种 
    • 1. cells数组初始化的时候; 
    • 2. cells数组扩容的时候; 
    • 3. 如果cells数组中某个元素为null,给这个位置创建新的Cell对象的时候;

1.3 成员变量base

  • 两个作用: 
    • 1. 在开始没有竞争的情况下,将累加值累加到base 
    • 2. 在cells初始化的过程中,cells不可用,这时会尝试将值累加到base上;

2.方法详解

那么它具体有哪些方法呢?下面来看下图:

                

2.1 add方法详解

public void add(long x) {	
        Cell[] as; long b, v; int m; Cell a;	
        /**	
         * 1. cells数组不为null(不存在争用的时候,cells数组一定为null,一旦对base的cas操作失败,才会初始化cells数组)	
         * 2. 如果cells数组为null,如果casBase执行成功,则直接返回,如果casBase方法执行失败(casBase失败,说明第一次争用冲突产生,需要对cells数组初始化)进入if内;	
         * casBase方法很简单,就是通过UNSAFE类的cas设置成员变量base的值为base+要累加的值	
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值