Java核心锁基准测试

这篇具有很好参考价值的文章主要介绍了Java核心锁基准测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试模型

基于JMH基准测试库

测试代码

package com.lsy.study.benchmark;

import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.StampedLock;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Thread)
@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 2, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@Threads(2)
public class SyncTest {

    static class TaskStack {

        private volatile int task;

        TaskStack() {
            this.task = 10000000;
        }

        int getTask() {
            this.task = this.task - 1;
            return this.task;
        }
    }

    @Setup
    public void prepare() {
    }

    @Benchmark
    public void synchronizedKeyWord() {
        Object lock = new Object();
        CountDownLatch countDownLatch = new CountDownLatch(50);
        TaskStack taskStack = new TaskStack();
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {
                while (true) {
                    synchronized (lock) {
                        int task = taskStack.getTask();
                        if (task <= 0) {
                            break;
                        }
                    }
                }
                countDownLatch.countDown();
            }).start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    @Benchmark
    public void reenterLock() {
        ReentrantLock reentrantLock = new ReentrantLock();
        CountDownLatch countDownLatch = new CountDownLatch(50);
        TaskStack taskStack = new TaskStack();
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {
                while (true) {
                    reentrantLock.lock();
                    try {
                        int task = taskStack.getTask();
                        if (task <= 0) {
                            break;
                        }
                    } finally {
                        reentrantLock.unlock();
                    }
                }
                countDownLatch.countDown();
            }).start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Benchmark
    public void stampedLock() {
        StampedLock stampedLock = new StampedLock();
        CountDownLatch countDownLatch = new CountDownLatch(50);
        TaskStack taskStack = new TaskStack();
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {
                while (true) {
                    stampedLock.writeLock();
                    try {
                        int task = taskStack.getTask();
                        if (task <= 0) {
                            break;
                        }
                    } finally {
                        stampedLock.tryUnlockWrite();
                    }
                }
                countDownLatch.countDown();
            }).start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) throws Exception {
        Options opts = new OptionsBuilder()
                .include(SyncTest.class.getSimpleName())
                .resultFormat(ResultFormatType.JSON)
                .build();
        new Runner(opts).run();
    }


}

结论图

样本一

参数:

20个线程
1000w个枪锁任务

结果

ReentrantLock: 平均用时263毫秒
StampedLock: 平均用时263毫秒
synchronized: 平均用时454毫秒
Java核心锁基准测试

样本二

参数:

50个线程
1000w个枪锁任务

结果

ReentrantLock: 平均用时271毫秒
StampedLock: 平均用时297毫秒
synchronized: 平均用时465毫秒

Java核心锁基准测试

样本三

参数:

50个线程
1w个枪锁任务

结果

ReentrantLock: 平均用时8.0毫秒
StampedLock: 平均用时8.1毫秒
synchronized: 平均用时8.9毫秒

Java核心锁基准测试

样本四

其实答案已经明显,用ReenterLock是为了高级特性(比如读写锁:性能肯定要更好),真要是性能区别也没多少,谁会真有几千万的并发任务在本地跑,真有synchronized关键字也简单明了,代码整洁;文章来源地址https://www.toymoban.com/news/detail-459759.html

到了这里,关于Java核心锁基准测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 七种最新群智能优化算法(NOA、LSO、SWO、ZOA、EVO、KOA、GRO)求解23个基准测试函数(含参考文献及MATLAB代码)

    (1)星雀优化算法NOA 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出,该算法模拟星雀的两种行为,即:在夏秋季节收集并储存食物,在春冬季节搜索食物的存储位置。星雀优化算法(Nutcracker optimizer algorithm,NOA)_IT猿手的博客-CSDN博客 参考文献:

    2024年02月16日
    浏览(340)
  • MQTT协议测试工具及核心代码

    基于MQTTnet做了个MQTT协议测试程序,本程序包括服务的和两个客户端,方便在不引入外部支撑的情况下测试MQTT协议。 测试软件界面如下 在Server区域, 启动服务可以选择MQTT服务使用的端口、用户名、密码。 如有有客户端需要连接服务,需要把这些信息告诉他们。 右边tab页有

    2024年02月12日
    浏览(40)
  • Go语言测试——【单元测试 | Mock测试 | 基准测试】

    作者 :非妃是公主 专栏 :《Golang》 博客主页 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 软件测试 :软件测试(英语:Software Testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测

    2024年02月10日
    浏览(59)
  • Go语言的单元测试与基准测试详解

    单元测试 以一个加法函数为例,对其进行单元测试。 首先编写add.go文件: 其次编写add_test.go文件,在go语言中,测试文件均已_test结尾,这里只需要在被测试的文件后加上_test即可。并且测试文件与要被测试的文件需要放在同一个包中,并不像 Java 那样需要将所有的测试文件

    2024年02月03日
    浏览(51)
  • go benchmark 基准测试

    目录 一、benchmark的使用 1.一个简单的例子 2.运行用例 3.benchmark 是如何工作的 4.提升准确度 5.内存分配情况 6.测试不同的输入 二、benchmark的注意事项 1.ResetTimer 2.StopTimer StartTimer go mod init test 创建项目test,创建目录bench/fib 创建fib.go 创建fib_test.go go 不管是单元测试还是基准测试,

    2024年02月02日
    浏览(64)
  • jmeter 基准测试

    在系统无压力时,分别对每个脚本用1个用户执行5分钟或循环100次操作,获得交易响应时间,通过此测试初步检查交易响应时间的量级,为后续测试提供对比基础。 通过基准测试,一是为了确认测试脚本的可用性,二是获取系统理论最快响应时间,为并发测试提供参考依据。

    2024年02月12日
    浏览(43)
  • 【go语言】3.3.1 单元测试和基准测试

    Go 语言的 testing 包为编写单元测试和基准测试提供了强大的支持。单元测试用于验证代码的正确性,基准测试用于测量代码的性能。 在Go语言中,单元测试和基准测试是两种常用的测试方法,用于测试和评估代码的质量和性能。 单元测试是一种针对代码中最小可测试单元(函

    2024年02月08日
    浏览(45)
  • 【测试开发】单元测试、基准测试和性能分析(以 Go testing 为例)

    你写不出 bug-free 的代码。 你认为自己写出了 bug-free 的代码,但它在你意想不到的地方出错了。 你觉得自己写出了永不出错的代码,但它的性能十分糟糕。 “测试左移”距离真正落地或许还有不短的距离,但在开发过程中注重自己的代码质量,至少养成 写单测 的习惯还是很

    2024年02月04日
    浏览(50)
  • 【ceph相关】ceph基准性能测试工具

    参考文档:RedHat-Ceph性能基准 本篇主要介绍几种ceph原生基准性能测试工具以及各自对应使用方法 不同于fio、vdbench等上层应用接口测试工具,ceph提供了一些自带的基准性能测试工具,用于测试rados、rbd等底层存储基准性能,可以比对底层基准性能和上层应用基准性能,确定潜

    2023年04月08日
    浏览(42)
  • Linux上的USB驱动器基准测试

    如果你想在U盘或其他外置USB硬盘上执行基准测试,程序与在普通内部存储设备上执行基准测试非常相似。我们需要做的就是测量USB硬盘的读写速度。在本教程中,你将看到如何在 Linux 系统上通过命令行和图形用户界面对USB硬盘进行基准测试。 在本教程中,你将学习 如何在主

    2024年02月08日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包