当前位置: 首页 > news >正文

Java 比Automic更高效的累加器

1、 java常见的原子类

类 Atomiclnteger、AtomicIntegerArray、AtomicIntegerFieldUpdater、AtomicLongArray、 AtomicLongFieldUpdater、AtomicReference、AtomicReferenceArray 和 AtomicReference- FieldUpdater

常见的原子类使用方法

使用 AtomicReference 来创建一个原子的 Double 引用 atomicDouble,初始值为 0.0。然后,多个线程并发执行累加操作,在每个线程内部使用 compareAndSet 方法来原子地更新累加结果。

compareAndSet 方法是 AtomicReference 类的原子操作方法,它会比较当前值是否与期望值相等,如果相等,则更新为新的值。如果当前值与期望值不相等,那么更新操作失败,线程需要重试。

请注意,使用 AtomicReference 只是一种手段,实现了类似原子操作的效果。由于 Double 是一个包装类型,操作它的时候需要注意自动装箱和拆箱的性能开销。如果需要高性能的原子 double 操作,可以考虑使用类似 DoubleAdder 的高性能原子类。

代码:

import java.util.concurrent.atomic.AtomicReference;public class AtomicDoubleExample {public static void main(String[] args) throws InterruptedException {AtomicReference<Double> atomicDouble = new AtomicReference<>(0.0);// 多个线程并发执行累加操作for (int i = 1; i <= 10; i++) {final double valueToAdd = i * 1.0; // 值为 1.0, 2.0, 3.0, ..., 10.0new Thread(() -> {while (true) {Double oldValue = atomicDouble.get();Double newValue = oldValue + valueToAdd;if (atomicDouble.compareAndSet(oldValue, newValue)) {// 成功更新后退出循环break;}}}).start();}// 主线程等待所有累加线程执行完成Thread.sleep(1000);// 打印累加结果System.out.println("Accumulated Result: " + atomicDouble.get());}
}

2、更高效的累加器Adder、Accumulator

例如:DoubleAdder和DoubleAccumulator也是用来处理double类型的值,并且在处理方式上与LongAdder和LongAccumulator类似

DoubleAdder

DoubleAdder是用于高效处理double类型累加操作的类。与AtomicLong相比,DoubleAdder在高并发环境下能够提供更好的性能,因为它采用了分散(Striped)的设计,将内部的数据分为多个独立的单元进行累加,减少了竞争,从而提高了吞吐量。

DoubleAdder的常用方法包括:

add(double x): 将指定的double值加到当前总和。
sum(): 返回当前的总和值。

示例代码:


public class CustomDoubleAdder {public static void main(String[] args) throws InterruptedException {DoubleAdder doubleAdder = new DoubleAdder();// 多个线程并发执行累加操作
for (int i = 0; i < 10; i++) {new Thread(() -> {doubleAdder.add(1.0);}).start();
}// 主线程等待所有累加线程执行完成
Thread.sleep(1000);System.out.println("Sum: " + doubleAdder.sum());}
}

DoubleAccumulator

DoubleAccumulator也用于高效处理double类型的累加操作,不同的是它可以自定义累加的逻辑。DoubleAccumulator使用DoubleBinaryOperator函数接口来定义累加操作的逻辑。

DoubleAccumulator的常用方法包括:

accumulate(double x): 使用自定义的累加函数将指定的double值加到当前累加结果。
get(): 返回当前的累加结果。

示例代码:
使用 DoubleBinaryOperator 函数接口来定义自定义的累加逻辑。DoubleBinaryOperator 是一个函数接口,它接受两个 double 类型的参数,并返回一个 double 类型的结果。使用 lambda 表达式或实现该接口来定义累加逻辑。

构造 DoubleAccumulator 时,需要传递一个初始值和一个 DoubleBinaryOperator 对象。初始值是累加的起始值,而 DoubleBinaryOperator 对象定义了每次累加时的操作逻辑。

import java.util.concurrent.atomic.DoubleAccumulator;
import java.util.function.DoubleBinaryOperator;public class CustomDoubleAccumulator {public static void main(String[] args) throws InterruptedException {// 定义自定义的累加逻辑,这里使用乘法进行累加DoubleBinaryOperator customAccumulator = (x, y) -> x * y;// 初始值为1.0double initialValue = 1.0;DoubleAccumulator doubleAccumulator = new DoubleAccumulator(customAccumulator, initialValue);// 多个线程并发执行累加操作for (int i = 1; i <= 10; i++) {final double valueToAdd = i * 1.0; // 值为 1.0, 2.0, 3.0, ..., 10.0new Thread(() -> {doubleAccumulator.accumulate(valueToAdd);}).start();}// 主线程等待所有累加线程执行完成Thread.sleep(1000);// 打印累加结果System.out.println("Accumulated Result: " + doubleAccumulator.get());}
}

相关文章:

Java 比Automic更高效的累加器

1、 java常见的原子类 类 Atomiclnteger、AtomicIntegerArray、AtomicIntegerFieldUpdater、AtomicLongArray、 AtomicLongFieldUpdater、AtomicReference、AtomicReferenceArray 和 AtomicReference- FieldUpdater 常见的原子类使用方法 使用 AtomicReference 来创建一个原…...

antDv table组件滚动截图方法的实现

在开发中经常遇到table内容过多产生滚动的场景&#xff0c;正常情况下不产生滚动进行截图就很好实现&#xff0c;一旦产生滚动就会变得有点棘手。 下面分两种场景阐述解决的方法过程 场景一&#xff1a;右侧不固定列的情况 场景二&#xff1a;右侧固定列的情况 场景一 打开…...

JavaSE【抽象类和接口】(抽象类、接口、实现多个接口、接口的继承)

一、抽象类 在 Java 中&#xff0c;一个类如果被 abstract 修饰称为抽象类&#xff0c;抽象类中被 abstract 修饰的方法称为抽象方法&#xff0c;抽象方法不用 给出具体的实现体。 1.语法 // 抽象类&#xff1a;被 abstract 修饰的类 public abstract class Shape { …...

微信小程序如何跳转H5页面

1、登录微信公众后台&#xff0c;进入【开发->开发管理->业务域名】&#xff0c;点击修改。 2、首先请下载校验文件&#xff0c;并将文件放置在域名根目录下。 我是把文件放在nginx主机的data目录下&#xff0c;然后通过增加nginx.config配置&#xff0c;重启nginx后可…...

C++(20):bit_cast

C++20之前如果想对不同的指针之间做类型转换需要通过reinterpret_cast,对于整数与指针之前的转换也需要通过reinterpret_cast: C++:reinterpret_cast_c++ reparant_cast_风静如云的博客-CSDN博客 但是reinterpret_cast的缺点是不同的编译环境下,无法包装转型的安全一致。 …...

STM32 低功耗-停止模式

STM32 停止模式 文章目录 STM32 停止模式第1章 低功耗模式简介第2章 停止模式简介2.1 进入停止模式2.1 退出停止模式 第3章 停止模式程序部分总结 第1章 低功耗模式简介 在 STM32 的正常工作中&#xff0c;具有四种工作模式&#xff1a;运行、睡眠、停止以及待机模式。 在系统…...

Hutool中 常用的工具类和方法

文章目录 日期时间工具类 DateUtil日期时间对象-DateTime类型转换工具类 Convert字符串工具类 StrUtil数字处理工具类 NumberUtilJavaBean的工具类 BeanUtil集合操作的工具类 CollUtilMap操作工具类 MapUtil数组工具-ArrayUtil唯一ID工具-IdUtilIO工具类-IoUtil加密解密工具类 …...

K8s(健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离)

前言 快速配置请直接跳转至汇总配置 K8s SpringBoot实现零宕机发布&#xff1a;健康检查滚动更新优雅停机弹性伸缩Prometheus监控配置分离&#xff08;镜像复用&#xff09; 配置 健康检查 健康检查类型&#xff1a;就绪探针&#xff08;readiness&#xff09; 存活探针&am…...

Django学习记录:使用ORM操作MySQL数据库并完成数据的增删改查

Django学习记录&#xff1a;使用ORM操作MySQL数据库并完成数据的增删改查 数据库操作 MySQL数据库pymysql Django开发操作数据库更简单&#xff0c;内部提供了ORM框架。 安装第三方模块 pip install mysqlclientORM可以做的事&#xff1a; 1、创建、修改、删除数据库中的…...

React Hooks 中的 useEffect(副作用)

useEffect 是什么&#xff1f; useEffect 是一个 React Hook&#xff0c;它允许你将组件与外部系统同步 当我们在 React 中使用 useEffect 这个 Hook 时&#xff0c;实际上是在告诉 React 在特定情况下执行我们定义的副作用函数。这种副作用函数可以处理一些与组件渲染结果无关…...

[CKA]考试之持久化存储卷PersistentVolume

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 创建一个pv&#xff0c;名字为app-config&#xff0c;大小为2Gi&#xff0c;…...

基于LLM的SQL应用程序开发实战(一)

基于LLM的SQL应用程序开发实战(一) 16.1 SQL on LLMs应用程序初始化 本节主要从案例代码的角度切入,探索ChatGPT以及大模型,尤其是从生产环境的视角,来思考具体的最佳实践。本节主要跟大家谈的是,在LangChain这样一个框架下,我们使用GPT-3.5或者GPT-4大模型,同时使用第…...

如何批量实现多行合并后居中

思路&#xff1a; 1.先填充数据 2.数据分类统计制作格式 3.格式刷刷制作出的格式 1.填充数据 思路&#xff1a;选中&#xff0c;F5定位空值&#xff0c;&#xff0c;⬆&#xff08;键盘上的上下左右哪里的上键&#xff09;&#xff0c;按住Ctrl然后按Enter。 2.数据分类统计…...

【深度学习_TensorFlow】手写数字识别

写在前面 到这里为止&#xff0c;我们已经学习完张量的常用操作方法&#xff0c;已具备实现大部分神经网络技术的基础储备了。这一章节我们将开启神经网络的学习&#xff0c;然而并不需要像学习前面那样了解大量的张量操作&#xff0c;而是将重点转向理解概念知识&#xff0c;…...

antv/l7地图,鼠标滚动,页面正常滑动-- 我们忽略的deltaY

背景 在官网项目中&#xff0c;需要使用一个地图&#xff0c;展示产品的分布区域及数量。希望的交互是&#xff0c;鼠标放上标点&#xff0c;tooltip展示地点和数量等信息。鼠标滚动&#xff0c;则页面随着滚动。但是鼠标事件是被地图代理了的&#xff0c;鼠标滚动意味着地图的…...

再续AM335x经典,米尔TI AM62x核心板上市,赋能新一代HMI

近十年来&#xff0c;AM335x芯片作为TI经典工业MPU产品&#xff0c;在工业处理器市场占据主流地位&#xff0c;其凭借GPMC高速并口、PRU协处理器等个性化硬件资源&#xff0c;在工业控制、能源电力、轨道交通、智慧医疗等领域广受用户欢迎。随着信息技术的快速发展&#xff0c;…...

springboot和Django哪一个做web服务器框架更好

目录 一、两者特点 二、各自优势 一、两者特点 编程语言&#xff1a; Spring Boot&#xff1a;使用 Java 编程语言。Django&#xff1a;使用 Python 编程语言。 生态系统和社区支持&#xff1a; Spring Boot&#xff1a;具有庞大的 Java 生态系统和强大的社区支持。适用于大型…...

C#核心知识回顾——21.归并排序

理解递归逻辑 一开始不会执行sort函数的 要先找到最小容量数组时 才会回头递归调用Sort进行排序 基本原理 归并 递归 合并 数组分左右 左右元素相比较 一侧用完放对面 不停放入新数组 递归不停分 分…...

基于netty的rpc远程调用

QPRC &#x1f680;&#x1f680;&#x1f680;这是一个手写RPC项目&#xff0c;用于实现远程过程调用&#xff08;RPC&#xff09;通信&#x1f680;&#x1f680;&#x1f680; 欢迎star串门&#xff1a;https://github.com/red-velet/ &#x1f680;Q-PRC 一、功能特性 …...

RabbitMQ输出日志配置

参考地址rabbitmq启用日志功能记录消息队列收发情况_rabbitmq开启日志_普通网友的博客-CSDN博客 启用日志插件命令 # 设置用户权限 rabbitmqctl set_user_tags mqtt-user administrator rabbitmqctl set_permissions -p / mqtt-user ".*" ".*" ".*&…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...

用js实现常见排序算法

以下是几种常见排序算法的 JS实现&#xff0c;包括选择排序、冒泡排序、插入排序、快速排序和归并排序&#xff0c;以及每种算法的特点和复杂度分析 1. 选择排序&#xff08;Selection Sort&#xff09; 核心思想&#xff1a;每次从未排序部分选择最小元素&#xff0c;与未排…...

【SSM】SpringMVC学习笔记7:前后端数据传输协议和异常处理

这篇学习笔记是Spring系列笔记的第7篇&#xff0c;该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记&#xff0c;供自己和他人参考。 Spring学习笔记目录 笔记1&#xff1a;【SSM】Spring基础&#xff1a; IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。 笔记2…...