LongAccumulator

LongAccumulator 能解决什么问题?什么时候使用 LongAccumulator?

1)LongAccumulator 的逻辑和 LongAdder 基本类似,唯一不同的是 LongAccumulator
持有一个函数式接口,目标值是通过该接口计算得到的,相对于 LongAdder,LongAccumulator 更灵活。

如何使用 LongAccumulator?

1)多线程并发更新一个统计值时可以采用 LongAccumulator,如最高同时在线人数。

使用 LongAccumulator 有什么风险?

1)LongAccumulator 使用空间换时间的模式会消耗更多的内存

LongAccumulator 核心操作的实现原理?

创建实例

    /**
* 二元函数式接口
*/
private final LongBinaryOperator function;
/**
* 身份值
*/
private final long identity; /**
* 基于一个二元函数式接口和身份值创建 LongAccumulator 实例
*/
public LongAccumulator(LongBinaryOperator accumulatorFunction,
long identity) {
function = accumulatorFunction;
base = this.identity = identity;
}

更新值

    /**
* 使用指定的值 x 更新 LongAccumulator
*/
public void accumulate(long x) {
Cell[] cs; long b, v, r; int m; Cell c;
/**
* 1)cells 为 null &&
* 使用函数式接口基于 base 和目标值 x 计算新值不等于 b &&
* 尝试原子更新 base
* 2)cells 不为 null
*/
if ((cs = cells) != null
|| (r = function.applyAsLong(b = base, x)) != b
&& !casBase(b, r)) {
/**
* 1)原子更新失败
* 2)cells 不为 null
*/
boolean uncontended = true;
/**
* 1)cells 为 null,则执行初始化
* 2)通过线程探测值定位的 cell 为 null,则尝试直接写入值
* 3)基于 cell 值和目标值 x 计算后的值和旧值不相等 && 原子更新失败,
* 说明出现 cell 竞争,则需要重新计算并写入值。
*/
if (cs == null
|| (m = cs.length - 1) < 0
|| (c = cs[Striped64.getProbe() & m]) == null
|| !(uncontended =
(r = function.applyAsLong(v = c.value, x)) == v
|| c.cas(v, r))) {
longAccumulate(x, function, uncontended);
}
}
}

读取值

    /**
* 根据函数式接口循环计算新值【参数为累计值和当前 Cell 中的旧值】并返回最终值,
* 如果计算过程中未发生竞争,则该值是精确的。
*/
public long get() {
final Cell[] cs = cells;
long result = base;
if (cs != null) {
for (final Cell c : cs) {
if (c != null) {
result = function.applyAsLong(result, c.value);
}
}
}
return result;
}

LongAccumulator 源码分析的更多相关文章

  1. Java并发编程笔记之LongAdder和LongAccumulator源码探究

    一.LongAdder原理 LongAdder类是JDK1.8新增的一个原子性操作类.AtomicLong通过CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器来说性能已经很好了,但是JDK ...

  2. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  3. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  4. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  5. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  6. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  7. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  8. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  9. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

随机推荐

  1. PyCharm中运行同一个python程序时选择平行窗口运行

    问题描述 当我们进行Socket编程时,客户端可能有多个,原则上如果有n个客户端,那么我们就要编辑n客户端的代码.然而其实我们每个客户端的代码都是相同,如果编辑n遍,将会相当的浪费空间. 解决办法 学 ...

  2. [IIS]修改MaxFieldLength与MaxRequestBytes彻底解决Request Too Long的问题

    当 IIS7/7.5 收到的请求头的长度超过16K(默认值),就会引发"Bad Request - Request Too Long. HTTP Error 400. The size of ...

  3. python之路之——操作系统的发展历史

    阅读目录 手工操作 —— 穿孔卡片 批处理 —— 磁带存储和批处理系统 多道程序系统 分时系统 实时系统 通用操作系统 操作系统的进一步发展 操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台 ...

  4. SQL SERVER 索引维护

    -- 全数据库索引重建 DECLARE @name varchar(100)DECLARE authors_cursor CURSOR FOR Select [name] from sysobject ...

  5. ubuntu下安装3.6.5

    1.下载python3.6.5安装包 地址:https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz 解压:tar -xvzf Python-3 ...

  6. string初始化

    #include <iostream> using namespace std; int main(int argc, const char * argv[]) { //通过const c ...

  7. Kettle整理

    下载kettle版本 (1)hadoop version 查看hadoop的版本    hadoop2.6 (2)则在data-integration\plugins\pentaho-big-data ...

  8. html+css 在图片上添加文字

    html <view class="container"> <image class="" src="{{book.image}}& ...

  9. 关于本地使用antd的upload组件上传文件,ngnix报错405的问题

    使用阿里的ui框架antd的upload,会自动请求ngnix上面的一个路径,也就是action所在的位置,一直报错405 not allowed,后来经讨论,统一将action写成一个路径,后端对这 ...

  10. 通过form提交 django的安全机制

    通过form提交 在form表单里面需要添加{%csrf_token%} 这样当你查看页面源码的时候,可以看到form中有一个input是隐藏的 总结原理:当用户访问login页面的时候,会生成一个c ...