Jmeter并发线程场景下共享变量错乱问题解决

  • 问题复现

    • 问题描述

    使用IF控制器获取前一个请求的后置脚本中设置的全局变量->并发线程下通过vars.get获取变量时,第一个线程和第二个线程获取的变量值一样->导致不同基础数据的请求入参一样

    • 方法如下:

      vars.put("shoppingCartIdList", shoppingCartIdList.toString());
      //设置标志位,用于后续接口是否触发请求
      vars.put(isSend, "true");

    • if控制器的设置

    • 同一个线程循环时出现获取变量混乱的情况

      第一个线程请求入参正确

      第二个请求入参是第一个的入参

      两者的入参一样。

  • 分析原因

    • 设置全局变量的方式不对,需要用AtomicReference类进行线程的安全操作,设置方法如下:

      复制代码
      AtomicReference<JSONArray> threadLocalShoppingCartIdList = new AtomicReference<>(shoppingCartIdList);
      vars.putObject("shoppingCartIdList", threadLocalShoppingCartIdList);
      vars.putObject(isSend, "true");

    AtomicReference说明:

    复制代码
    - 原子操作:AtomicReference 提供了原子性的引用更新操作。通过CAS

    (Compare And Swap)算法,可以确保对引用对象的原子操作,避免了使用锁

    带来的性能开销。

    • 共享变量:AtomicReference 适用于需要在多个线程之间共享同一个引用对象的
      场景,可以安全地对引用对象进行读取和更新操作。

    • 线程间通信:AtomicReference 主要用于实现在多线程环境下对共享变量的原子
      操作,是一种并发编程的工具。

    • 设置安全的变量后,如何取出?方法如下:

      AtomicReference<JSONArray> shoppingCartIdListRef = new AtomicReference<>(new JSONArray(vars.get("shoppingCartIdList")));
      JSONArray shoppingCartIdList = shoppingCartIdListRef.get();

通过AtomicReference方法可以保障线程并发场景下使用的全局变量设置方式在共享变量间每个线程各自取自己的,不会出现变量混乱的情况。


更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:

相关推荐
张永清4 天前
《JMeter核心技术、性能测试与性能分析》 教学大纲及标准
jmeter·性能测试·性能调优·性能分析·教材
在未来等你6 天前
RabbitMQ面试精讲 Day 20:RabbitMQ压测与性能评估
性能优化·消息队列·rabbitmq·压力测试·性能测试·面试题
张永清12 天前
软件性能测试工具的发展以及不同性能测试工具之间的使用对比总结
jmeter·性能测试·性能调优·性能分析
张永清14 天前
【图书介绍】清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》,专为解决实际问题而生
jmeter·性能测试·性能调优·性能分析
测试者家园16 天前
用 LLM 辅助性能测试报告生成
人工智能·llm·性能测试·ai赋能·智能化测试
测试者家园19 天前
慢查询日志在性能优化中的价值
sql·性能优化·性能测试·慢查询·持续测试·智能化测试
试着20 天前
零基础学习性能测试第五章:JVM性能分析与调优-JVM概念,java程序运行原理
java·jvm·学习·零基础·性能测试
试着21 天前
零基础学习性能测试第六章:性能难点-Jmeter文件上传场景压测
学习·jmeter·零基础·性能测试
试着22 天前
零基础学习性能测试第五章:Tomcat的性能分析与调优-Tomcat原理,核心配置项,性能瓶颈分析,调优
学习·零基础·tomcat·性能测试
试着22 天前
零基础学习性能测试第五章:JVM性能分析与调优-垃圾回收器的分类与回收
jvm·学习·零基础·性能测试·垃圾回收器