返回顶部
首页 > 资讯 > 精选 >使用LongAdder好还是volatile好
  • 672
分享到

使用LongAdder好还是volatile好

2023-06-27 11:06:25 672人浏览 独家记忆
摘要

今天小编给大家分享一下使用LongAdder好还是volatile好的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。【参考】v

今天小编给大家分享一下使用LongAdder好还是volatile好的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

【参考】volatile 解决多线程内存不可见问题。对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题。

说明:如果是 count++ 操作,使用如下类实现:AtomicInteger count = new AtomicInteger(); count.addAndGet(1); 如果是 jdk8,推荐使用 LongAdder 对象,比 AtomicLong 性能更好(减少乐观 的重试次数)。

以上内容共有两个重点:

  1. 类似于 count++ 这种非一写多读的场景不能使用 volatile

  2. 如果是 JDK8 推荐使用 LongAdder 而非 AtomicLong 来替代 volatile,因为 LongAdder 的性能更好。

但口说无凭,即使是孤尽大佬说的,咱们也得证实一下,因为马老爷子说过:实践是检验真理的唯一标准

这样做也有它的好处,第一,加深了我们对知识的认知;第二,文档上只写了LongAdderAtomicLong 的性能高,但是高多少呢?文中并没有说,那只能我们自己动手去测试喽。

(推荐教程:Java教程)

话不多,接下来我们直接进入本文正式内容...

volatile 线程安全测试

首先我们来测试 volatile 在多写环境下的线程安全情况,测试代码如下:

public class VolatileExample {    public static volatile int count = 0; // 计数器    public static final int size = 100000; // 循环测试次数    public static void main(String[] args) {        // ++ 方式 10w 次        Thread thread = new Thread(() -> {            for (int i = 1; i <= size; i++) {                count++;            }        });        thread.start();        // -- 10w 次        for (int i = 1; i <= size; i++) {            count--;        }        // 等所有线程执行完成        while (thread.isAlive()) {}        System.out.println(count); // 打印结果    }}

我们把 volatile 修饰的 count 变量 ++ 10w 次,在启动另一个线程 -- 10w 次,正常来说结果应该是 0,但是我们执行的结果却为:

1063

结论:由以上结果可以看出 volatile 在多写环境下是非线程安全的,测试结果和《Java开发手册》相吻合。

LongAdder VS AtomicLong

接下来,我们使用 oracle 官方的  JMH 来测试一下两者的性能,测试代码如下:

import org.openjdk.jmh.annotations.*;import org.openjdk.jmh.infra.Blackhole;import org.openjdk.jmh.runner.Runner;import org.openjdk.jmh.runner.RunnerException;import org.openjdk.jmh.runner.options.Options;import org.openjdk.jmh.runner.options.OptionsBuilder;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.LongAdder;@BenchmarkMode(Mode.AverageTime) // 测试完成时间@OutputTimeUnit(TimeUnit.NANOSECONDS)@Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS) // 预热 1 轮,每次 1s@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS) // 测试 5 轮,每次 3s@Fork(1) // fork 1 个线程@State(Scope.Benchmark)@Threads(1000) // 开启 1000 个并发线程public class AlibabaAtomicTest {    public static void main(String[] args) throws RunnerException {        // 启动基准测试        Options opt = new OptionsBuilder()                .include(AlibabaAtomicTest.class.getSimpleName()) // 要导入的测试类                .build();        new Runner(opt).run(); // 执行测试    }    @Benchmark    public int atomicTest(Blackhole blackhole) throws InterruptedException {        AtomicInteger atomicInteger = new AtomicInteger();        for (int i = 0; i < 1024; i++) {            atomicInteger.addAndGet(1);        }        // 为了避免 JIT 忽略未被使用的结果        return atomicInteger.intValue();    }    @Benchmark    public int longAdderTest(Blackhole blackhole) throws InterruptedException {        LongAdder longAdder = new LongAdder();        for (int i = 0; i < 1024; i++) {            longAdder.add(1);        }        return longAdder.intValue();    }}

从上述的数据可以看出,在开启了 1000 个线程之后,程序的 LongAdder 的性能比 AtomicInteger 快了约 1.53 倍,你没看出是开了 1000 个线程,为什么要开这么多呢?这其实是为了模拟高并发高竞争的环境下二者的性能查询。

如果在低竞争下,比如我们开启 100 个线程,测试的结果如下

结论:从上面结果可以看出,在低竞争的并发环境下 AtomicInteger的性能是要比 LongAdder 的性能好,而高竞争环境下 LongAdder的性能比 AtomicInteger,当有 1000 个线程运行时,LongAdder 的性能比 AtomicInteger 快了约 1.53 倍,所以各位要根据自己业务情况选择合适的类型来使用。

性能分析

为什么会出现上面的情况?这是因为 AtomicInteger 在高并发环境下会有多个线程去竞争一个原子变量,而始终只有一个线程能竞争成功,而其他线程会一直通过 CAS 自旋尝试获取此原子变量,因此会有一定的性能消耗;而 LongAdder 会将这个原子变量分离成一个 Cell 数组,每个线程通过 Hash 获取到自己数组,这样就减少了乐观锁的重试次数,从而在高竞争下获得优势;而在低竞争下表现的又不是很好,可能是因为自己本身机制的执行时间大于了锁竞争的自旋时间,因此在低竞争下表现性能不如 AtomicInteger

以上就是“使用LongAdder好还是volatile好”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: 使用LongAdder好还是volatile好

本文链接: https://lsjlt.com/news/309848.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用LongAdder好还是volatile好
    今天小编给大家分享一下使用LongAdder好还是volatile好的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。【参考】v...
    99+
    2023-06-27
  • 使用Python好还是R语言好
    这篇文章主要讲解了“使用Python好还是R语言好”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使用Python好还是R语言好”吧!一、数据可视化数据科学的一个重要部分是交流。分析成果需要以...
    99+
    2023-06-16
  • mysql好还是sqlserver好
    对于小型到中型应用程序,mysql 易用、开源且经济实惠;对于大型或复杂的应用程序,sql server 提供更广泛的功能、更高的性能和更好的企业支持。考虑因素包括:应用程序大小、预算、...
    99+
    2024-08-01
    mysql sqlserver
  • DDNS开启好还是禁用好
    DDNS​ (Dynamic Domain Name Server,动态域名服务)是将用户的动态 IP 地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态 IP 地址传送给位于服务商主机上的服...
    99+
    2023-09-14
    网络 服务器 网络协议
  • web开发用px好还是rem好
    本篇内容主要讲解“web开发用px好还是rem好”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web开发用px好还是rem好”吧!   px   px意为像...
    99+
    2024-04-02
  • php用win好还是linux系统好
    本篇内容主要讲解“php用win好还是linux系统好”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php用win好还是linux系统好”吧!php可以用win也可以用linux系统,他们各有好...
    99+
    2023-06-22
  • 云主机用asp好还是php好
    云主机可以同时支持ASP和PHP,所以选择使用哪种语言取决于您的具体需求和个人偏好。- ASP(Active Server Page...
    99+
    2023-09-13
    云主机 asp php
  • 选择Go好还是Java好
    这篇文章主要介绍“选择Go好还是Java好”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“选择Go好还是Java好”文章能帮助大家解决问题。1. 初遇 Go2017 年初,我接手了一个非常有趣的项目,...
    99+
    2023-06-27
  • 详解win10好还是win7好
    有个小伙伴刚刚组装完自己的电脑,但还没决定要安装和使用哪个操作系统。我正在权衡是否安装Win7还是Win10操作系统,但现在无法确定哪个更好。那么今天小编就给大家分析下win10和win7哪个好。首先,小编的观点是建议大家使用win10系统...
    99+
    2023-07-10
  • win7的系统好还是win10好
    小伙伴刚刚完成电脑组装,现在犹豫不决,不知道是选择win7系统还是win10系统。目前正在犹豫要安装哪个系统,不确定Win7好还是Win10好。那么今天小编就给大家分析下win7的系统好还是win10好。感兴趣的小伙伴们快来看看吧!1、免费...
    99+
    2023-07-17
  • windows系统win7好还是win10好
    自从win10发布之后,就有许多的用户朋友陷入到纠结中,在win10跟win7这两者当选择困难,下面就和大家聊聊win7系统和win10系统哪个好用吧。1、稳定性能Win7给我们的第一印象就是稳定了,Win7系统的稳定性是大家公认的。而Wi...
    99+
    2023-07-11
  • 租用云主机好还是服务器好
    租用云主机还是购买服务器,取决于你的需求和预算。租用云主机的优点包括:1. 弹性扩展:云主机可以根据业务需求进行弹性扩展,根据流量变...
    99+
    2023-09-17
    云主机 服务器
  • 开发php用原生好还是框架好
    这篇文章主要介绍“开发php用原生好还是框架好”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“开发php用原生好还是框架好”文章能帮助大家解决问题。原生 PHP当我们说“使用原生 PHP 时”,我们指...
    99+
    2023-07-05
  • 物理机好用还是云服务器好
    这取决于您的具体使用场景和数据需求。在某些情况下,云服务器更适合处理大量非实时的数据,例如日志文件或者请求响应,而在某些情况下,如需要高性能计算或者需要更高的可靠性,云服务器可能更适合。 对于大多数数据密集型应用程序,您可能更需要云服务器...
    99+
    2023-10-26
    好用 物理 服务器
  • 物理机好还是云服务器好用
    这取决于您的具体应用程序和数据存储需求。以下是一些常见的用例和技术,并对它们进行了比较和分析: 用例1:企业大数据应用程序:大数据是指规模庞大、来源多样、数据形式复杂且变化频繁的数据集合,因此选择云服务器提供商的云服务是非常重要的,例如亚...
    99+
    2023-10-26
    好用 物理 服务器
  • 云服务器好还是物理机好用
    云服务器和物理机是两种常见的虚拟化技术。以下是它们各自的优缺点: 优点: 快速部署和弹性伸缩:使用云服务器可在短时间内将应用程序从一台服务器部署到另一台服务器,从而大大提高了部署效率。 高可用性:云服务器具有高可用性的功能,当客户端或云...
    99+
    2023-10-27
    好用 物理 服务器
  • 物理机好用还是云服务器好用
    这取决于您的具体应用程序。如果您的应用程序需要高性能计算和高可用性,那么在云服务器上更适合,因为这些服务通常具有弹性的伸缩性,可以按照您的需求随时扩展和缩小规模。但是,如果您的应用程序需要高可用性和可靠性,那么使用高性能计算机可能更为合适,...
    99+
    2023-10-26
    好用 物理 服务器
  • Win10系统选8G好还是16G好
    本篇内容介绍了“Win10系统选8G好还是16G好”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一台相对正常的Win10电脑,无论是优化的再...
    99+
    2023-06-28
  • python好还是golang好?异同分析
    随着技术的不断发展,编程语言也在不断涌现,每一种编程语言都有其独特的用途和优势,而在这些编程语言中,Python和Golang都备受程序员们的喜爱。那么,Python还是Golang更好呢?这个问题一直以来都备受争议,下面让我们来探讨一下它...
    99+
    2023-05-14
  • win10更新好还是不更新好
    是否更新Windows 10取决于您个人的需求和偏好。以下是一些考虑因素:1. 安全性:更新Windows 10可以提供最新的安全补...
    99+
    2023-08-26
    win10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作