热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

并发测试工具_JUC整理笔记三之测试工具jcstress

并发测试工具Jcstress使用教程Jcstress全称JavaConcurrencyStress,是一种并发压力测试工具,可以帮助研究JVM、java

并发测试工具Jcstress使用教程

Jcstress 全称 Java Concurrency Stress,是一种并发压力测试工具,可以帮助研究JVM、java类库和硬件中并发的正确性。

Wiki地址:https://wiki.openjdk.java.net/display/CodeTools/jcstress

Wiki中有一个Jcstress的example,可以根据example很方便入门使用jcstress。当然,我们也可以手动创建自己的Jcstress测试工程。

Maven例子

添加maven依赖

org.openjdk.jcstress jcstress-core 0.5org.openjdk.jcstress jcstress-samples 0.5

pom.xml 可以如下:

4.0.0jfound jcstress-test 1.0.0-SNAPSHOTUTF-8org.openjdk.jcstress jcstress-core 0.5org.openjdk.jcstress jcstress-samples 0.5org.apache.maven.plugins maven-compiler-plugin 3.8.11111

新增一个测试类,这次以测试变量加 volatile 和不加 volatile 的区别。代码如下:

package jfound;import org.openjdk.jcstress.annotations.*;public class VolatileTest { @JCStressTest(Mode.Termination) @Outcome(id = "TERMINATED", expect = Expect.ACCEPTABLE) @Outcome(id = "STALE", expect = Expect.ACCEPTABLE_INTERESTING) @State public static class NoVolatile { private int i = 0; @Actor public void actor() { while (i == 0) { //nothing } } @Signal public void single() { i = 1; } } @JCStressTest(Mode.Termination) @Outcome(id = "TERMINATED", expect = Expect.ACCEPTABLE) @Outcome(id = "STALE", expect = Expect.FORBIDDEN) @State public static class AddVolatile { private volatile int i = 0; @Actor public void actor() { while (i == 0) { //nothing } } @Signal public void single() { i = 1; } }}

VolatileTest 类里面有两个静态内部类,其中 NoVolatile 的 i 是没有加 volatile 关键字的,AddVolatile 类中的 i 是有加 volatile 关键字的。

测试注解说明

  • org.openjdk.jcstress.annotations.JCStressTest

该注解标记一个类为一个并发测试的类,有一个属性 value 为 org.openjdk.jcstress.annotations.Mode。mode 有ContinuousTermination 两种模式。Continuous 模式是运行几个 org.openjdk.jcstress.annotations.Actor 、org.openjdk.jcstress.annotations.Ariter 线程,并收集结果。Termination 模式运行具有阻塞/循环操作的单个 Actor 和 Singal 的测试。

  • org.openjdk.jcstress.annotations.Outcome

Outcome 是描述测试结果,并处理这个结果,该注解有 idexpectdesc 这三个属性。

其中 id 接收结果,如上面的 TERMINATEDSTALE 就是结果,id 还支持正则表达式;expect 是期望处理结果,类型为 org.openjdk.jcstress.annotationsExpect ,有 ACCEPTABLEACCEPTABLE_INTERESTINGFORBIDDENUNKNOWN 四种类型,ACCEPTABLE 表示接受当前结果,ACCEPTABLE 结果不一定会存在;ACCEPTABLE_INTERESTING 和 ACCEPTABLE 差不多,唯一不一样的是,这个结果会在生成的报告中高亮;FORBIDDEN 表示永远不应该出现的结果,若测试过程中有该结果,意味着测试失败; UNKNOWN 没有评分,不使用。

如上面例子所示,一个测试类 (JCStressTest) 中可以有一个或多个 Outcome 。

  • org.openjdk.jcstress.annotations.State

标记这个类是有状态的,有状态的意识是拥有数据,而且数据是可以被修改的,如上面测试例子中的 i , 其中 i 就是拥有的数据。为了方便理解,可以拿 Stateless 来做对比;如一些实体类是有状态(State)的,Service理应设置为无状态的 Sateless ,尽管service有属性,但是属性也是不能被修改的。

State 修饰的类必须是 public 的,不能是内部类,但是可以是静态内部类,如上面例子。

State 修饰的类必须有一个默认构造函数

  • org.openjdk.jcstress.annotations.Actor

该注解标记的方法会被线程调用,被 Actor 修饰方法所在的类必须有 State 或者 Result注解,被其修饰的方法可以抛出异常,但是抛出异常的话,会引起测试失败。注意的是,Actor 标记的每个方法仅由一个特定线程调用,而且每个被 State 标记的实例仅调用每一个方法Actor 修饰的方法之间是没有顺序的,调用是并发执行的。

与之相对的还有 org.openjdk.jcstress.annotations.Arbiter 注解,Arbiter 注解和 Actor 注解差不多,不一样的是 Arbiter 注解声明的方法访问是在所有 State 之后,而且 Actor 所有的内存都对 Arbiter 可见,这就使得 Arbiter 在确认最终状态信息上有很大的作用。

  • org.openjdk.jcstress.annotations.Singal

改注解在 Termination 模式下是比较有用的,它标记的方法执行是在 Actor 标记方法执行之后。

  • org.openjdk.jcstress.annotations.Result

用该注解标记的类是测试结果的类,如 org.openjdk.jcstress.infra.results 下的类,该注解标记的类所有 field 都必须是原生数据类似或者是 String 类型,所有 field 都应该是 public。可以参考 org.openjdk.jcstress.infra.results 下的类。用法如下

@Actorpublic void actor1(I_Result r) { r.r1 = 1;}

把测试结果用 Result 修饰的类接收,通常是配合 toString 打印出来。

  • org.openjdk.jcstress.annotations.Description

与测试无关,可以定义一些描述,方便查看

  • org.openjdk.jcstress.annotations.Ref

与测试无关,提供一些引用,如地址,ISBN等等。

  • org.openjdk.jcstress.annotations.JCStressMeta

Description 、Outcome、Ref 这些注解是可以放到一个公共类,然后由 JCStressMeta 注解引进来,以达到重复使用的目的。

运行及结果说明

在idea下执行如下

e594314efd2973020af79c40a771f0e8.png

其中 Main class 填写 org.org.openjdk.jcstress.Main , 参数中的 -t 是指指定测试包名,不指定的话是默认扫描项目所有包。

在执行完成后,会在项目所在的目录下生成 results 文件夹,里面有个 index.html ,用浏览器打开即可查看报告。

6718e7df505e4ff15e7261b7f09e3a18.png
35e9157703ec512f1d21698f132a6579.png

总结

本文以一个例子展开来编写 Jcstress 并发测试工具的使用说明,并描述了 Jcstress 的所有核心注解,方便初学者去了解并借助该工具来学习并发编程。

本文使用 mdnice 排版



推荐阅读
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
author-avatar
mobiledu2502873797
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有