atomiclong_想要更快地使用AtomicLong? 等待它。

atomiclong

我经常听到Java原子类型(java.util.concurrent.atomic)超级快,可以很好地与高度并发的代码一起使用。 大多数时候,原子以健壮和高效的方式完成其工作。 但是,在某些情况下,原子类型上非托管争用的隐藏成本成为严重的性能问题。 让我们看一下如何实现java.util.concurrent.atomic.Atomic *类型以及该设计的含义。

所有原子类型,例如AtomicLong,AtomicBoolean,AtomicReference等,本质上都是易失值的包装器。 附加值来自内部使用的sun.misc.Unsafe ,可为这些类型提供CAS功能。

本质上, CAS(比较和交换)是由现代CPU硬件实现的原子指令,它允许以安全有效的方式进行无阻塞的多线程数据操作。 与锁定相比,CAS的巨大优势在于,由于没有套利,CAS不会在内核级别上产生任何开销。 而是,编译器发出CPU指令,例如锁cmpxchg,锁xadd,锁addq等。这与从JVM角度调用指令所获得的速度一样快。

在许多情况下,低成本的CAS提供了一种有效的替代方法来锁定基元,但是在满足场景的情况下使用CAS的成本呈指数级增长。

Dave Dice,Danny Hendler和Ilya Mirsky在一项非常有趣的研究中对这个问题进行了研究 。 我强烈建议您阅读全文,因为它比这篇简短的文章包含了更多有价值的信息。

我从论文中复制了一些概念,并对其进行了测试。 由于人们对原子(CAS)性能普遍存在误解,因此许多Java程序员应该发现结果很能说明问题。

实现退避竞争管理的代码非常简单。 它回退了很短的时间,而不是循环失败的比较和交换,让其他线程尝试更新。

import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.LockSupport;public class BackOffAtomicLong {public static long bk;private final AtomicLong value = new AtomicLong(0L);public long get() {return value.get();}public long incrementAndGet() {for (;;) {long current = get();long next = current + 1;if (compareAndSet(current, next))return next;}}public boolean compareAndSet(final long current, final long next) {if (value.compareAndSet(current, next)) {return true;} else {LockSupport.parkNanos(1L);return false;}}public void set(final long l) {value.set(l);}}

这些测试是在64位Linux 3.5.0(x86_64)和Intel®CoreTM i7-3632QM CPU @ 2.20GHz(8个逻辑内核)上使用64位Hotspot Java 1.7.0_25-b15执行的。

不出所料,对于高负载争用,两个实现之间没有太大的区别:

bal01

但是,在商店竞争激烈的情况下,它变得更加有趣。 这种情况暴露了Hotspot的AtomicLong实现所采用的乐观重试方法的弱点。

bal02

同样,在读写器混合竞争的情况下,轻量级访问管理的好处也显而易见。

bal03

当涉及套接字间通信时,结果会有很大的不同,但是不幸的是,我在某种程度上失去了针对基于Intel Xeon的硬件进行测试的输出。 随时发布不同架构/ JVM的结果。

参考:是否 希望使用AtomicLong更快? 等待它。 来自我们的JCG合作伙伴 Wojciech Kudla在Fast上。 快点。 怪胎的博客。

翻译自: https://www.javacodegeeks.com/2014/01/want-to-get-faster-with-atomiclong-make-it-wait.html

atomiclong

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/344724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字信号处理基础知识00

数字信号处理 Digital Signal Processing 离散时间信号与系统分析 Z变换 离散傅立叶变换(DFT) 快速傅立叶变换(FFT) 离散时间系统的结构 IIR滤波器的设计 FIR滤波器的设计 绪论——数字信号处理概述 基本概念:信号定…

Apache Camel 3的工作终于开始了

我们正在开始Apache Camel 3的工作。 我们正在多方面努力改善骆驼并引入新功能。 实际上,Guillaume Nodet的第一项工作实际上是在10月初开始的 ,在那里他通过清理代码库,删除不推荐使用的代码和组件,改进路由引擎和核心中的其他内…

工程电磁场与电磁波第1章——矢量分析

1矢量分析 1.1 矢量代数 1.1.1 矢量加减法 1.1.2 矢量乘积 矢量的标量积:点积 矢量的矢量积:叉积 标量三重积、矢量三重积 1.2 正交坐标系 正交坐标系 正交坐标系的点积、叉积、标量三重积 度量系数 1.2.1 直角坐标系 1.2.2 圆柱坐标系 1.2.3 球坐标…

蓝桥杯扫盲之int, char, unsigned int, unsigned char的使用

一、C51常用数据类型 C语言中默认规则:short int 即为int,long int 即为 long,前面若无unsigned符号默认signed型。 0和1每一个所占空间是一位(b),也是单片机存储器中最小的单位。 1B(字节&…

第十一届 蓝桥杯 单片机设计与开发项目 省赛 程序设计试题及源码

一、试题 1、 基本要求 1.1 使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计 与调试。 1.2 选手在程序设计与调试过程中,可参考组委会提供的“资源数据包”。 1.3 请注意: 程序编写、调试完成后选手应通过考试系统提交完整、可编译的 Keil 工程文件…

AWS:避免那些“神圣的法案”时刻的一些技巧

云非常棒:几乎100%的可用性,几乎零维护,按需付费,最重要的是,它具有无限的可扩展性。 但是最后两个很容易把你咬回去,把那令人敬畏的事情变成一场噩梦。 有时您会看到类似的故事: …

樊昌信版通信原理期末复习第一章绪论

第1章 绪论 一、知识点梳理 1、通信的目的:传递消息中所包含的信息。 2、消息:是物质或精神状态的一种反映。 3、信息:是消息中包含的有效内容。 4、通信系统的一般模型 信源输入变换器:将非电物理量变成电信号。 发送设备&…

DC/DC开关电源设计

DC/DC开关电源设计视频讲解链接:https://www.bilibili.com/video/BV1Dv411y7jM?t156 一、电源概述 主要内容:线性稳压电源和开关稳压电源的概念理解 1、稳压电源(stabilized voltage supply)是能为负载提供稳定的交流电或直流…

jboss junit_使用junit-drools进行JBoss Drools单元测试

jboss junit最近,我一直在大量使用JBoss Drools进行项目。 我不是Drools专家-我也不太相信这个框架,或者可能不是只相信该项目中的特定用例-我发现很难为基于Drools的业务规则编写简单,可维护的单元测试 。 这就是junit-drools诞生的方式–简…

【从3D点云生成平面图:一种空间划分方法】

文章目录 概要概述实验总结 概要 本文提出了一种从原始传感器数据自动重建室内环境平面图的新方法。现有的方法是通过检测角点并将它们连接起来,以平面图形的形式生成平面图,与此相反,本文采用了一种策略,将空间分解为多边形分区…

数字信号处理基础知识之DFT、DTFT、DFS、FFT基本概念扫盲

一、名词汇总 DFT:离散傅里叶变换(Discrete Fourier Transform); DTFT:离散时间傅里叶变换(Discrete-time Fourier Transform); DFS:离散傅里叶级数,又称离散…

数字基带传输学习笔记00引言

S0 引言 一、是什么 1、什么是数字基带信号? 未经调制的数字信号,所占据频谱从零频或很低频率开始 若信道中传输的是数字信号,则称为数字通信系统。这些信号包含丰富的低频分量,甚至直流分量,称为数字基带信号。 如…

如何在ADF中将参数传递给ActionListener

在某些情况下,需要将值传递给ADF Button的ActionListener。 可以由actionListeners调用的方法只有一个ActionEvent类型的参数。 因此,我将解释如何将参数传递给该bean方法,但是它在方法签名中仅包含一个参数ActionEvent。 我在页面上添加了…

计算机二级公共基础部分学习笔记

1、Rear指向队列最后一个元素的位置 Front指向队列第一个元素的前一个位置 RearFront,要么满,要么空;循环队列元素个数求法; 2、总节点数不同度节点数相加 总节点数度数*对应节点数和1 3、二叉树 前序:根-左-右 中序&…

FPGA初学者入门相关概念知识点

一、基础入门 1、整体理解 简单来说,FPGA 就是“可反复编程的逻辑器件”。 ASIC 和 FPGA 就如同印刷品和白纸 ARM 虽然有很多外设,DSP 虽然具备强大的信号运算能力,但是,ARM 能做的,DSP 能做的,FPGA 一定…

01数字基带信号及其频谱特性

S1 数字基带信号及其频谱特性 一、分类 1、单极性不归零波形 优点:电脉冲之间无间隔,极性单一,易于用TTL,CMOS电路产生; 缺点: a) 有直流成份;判决电平不能稳定在最佳的电平,抗噪声…

人工智能英语学习笔记

基础篇单词 mythology n. ancient myths in general; ideas that many people think are true but that do not exist or are false 神话 Examples: A satyr is half man and half goat in Greek and Roman mythology. 在希腊和罗马神话中,森林之神是半人半羊的样子…

CSDN公式编辑(latex语言应用)整理

在线Latex公式编辑器 latex语法指南 一、常用规则 1、编辑公式时,公式显示在两个$$之间。 $ 公式 $ :可写在句中,如me>smartnicehealthyme>smartnicehealthyme>smartnicehealthy $ $ 公式 $ $ :比较大,如me…

API网关正在经历身份危机

这些年来,API网关正在经历一些身份危机 。 它们是否是集中的共享资源,以促进对外部实体的API公开和治理? 它们是集群入口哨兵,可以严格控制哪些用户流量进入或离开集群吗? 还是他们根据自己拥有的客户端类型&#x…

通信原理速学02:随机过程

模块1 随机过程 随机过程与样本函数 随机过程指一类随时间做随机变化的过程,用ξ(t)表示,其值不确定,无法用确切的时间函数描述。 随机过程的每一次实现,就称为一次样本函数ξi(t),随机过程是所有样本函数的集合。 基…