首页 > 其他分享 >Jmeter并发线程场景下共享变量错乱问题解决

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

时间:2024-11-11 10:58:05浏览次数:1  
标签:变量 vars 线程 shoppingCartIdList 错乱 共享 Jmeter AtomicReference

  • 问题复现

    • 问题描述

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

    • 方法如下:
     vars.put("shoppingCartIdList", shoppingCartIdList.toString());
      //设置标志位,用于后续接口是否触发请求
      vars.put(isSend, "true");
    
    • if控制器的设置
      image

    • 同一个线程循环时出现获取变量混乱的情况
      第一个线程请求入参正确
      image
      第二个请求入参是第一个的入参
      image
      两者的入参一样。

  • 分析原因

    • 设置全局变量的方式不对,需要用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测试】获取:
Coding测试

标签:变量,vars,线程,shoppingCartIdList,错乱,共享,Jmeter,AtomicReference
From: https://www.cnblogs.com/CodingTest/p/18539300

相关文章

  • 因为mysql 8新的认证插件导致主从复制的IO线程失败
    1、错误信息Last_IO_Error:errorconnectingtomaster'[email protected]:3306'-retry-time:60retries:1message:Authenticationplugin'caching_sha2_password'reportederror:Authenticationrequiressecureconnection.2、在主库检查复制用户的pl......
  • 使用YOLO 模型进行线程安全推理
    使用YOLO模型进行线程安全推理一、了解Python线程二、共享模型实例的危险2.1非线程安全示例:单个模型实例2.2非线程安全示例:多个模型实例三、线程安全推理3.1线程安全示例四、总结4.1在Python中运行多线程YOLO模型推理的最佳实践是什么?4.2为什么每个线程都要有......
  • 【C++】验证STL容器线程不安全
    文章目录概要整体架构流程技术名词解释技术细节示例代码代码现象分析代码来验证一下vector的扩容解决方法小结概要在并发编程中,线程安全是确保多个线程在同时访问共享资源时,不会引起数据竞争或意外的行为。在C++中,std::vector通常并不是线程安全的,因此在多线程环境......
  • Java坑人面试题系列 线程线程池(高级难度)
    ExecutorService接口及相关API细节详解。。这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。如果你看过往期的问题,就会发现每一个都不简单。这些试题模拟了认证考试中的一些难题。而“中级(intermediate)”和“......
  • Linux复习2(常用命令与进程线程)
    常用命令:进入管理员模式:sudosu退出:exit;查看当前目录文件:ls(-a:显示隐藏文件;-l:查看详细信息)查看当前目录位置:pwd查看文件内容:catmoreheadtail(head与tail可以加行数)查看多个:cata.cb.c拼接文件:cata.cb.c->d.c查看帮助文档:manname创......
  • 29. 多线程编程
    一、什么是线程  线程(thread)它们是同一个进程下执行的,并共享相同的下上文。线程包括开始、执行顺序和结束三部分。它有一个指令指针,用于记录当前运行的上下文。当其它线程运行时,它可以被抢占(中断)和临时挂起(也称为睡眠)——这种做法叫做让步(yielding)。  当一个程序运行时,默认......
  • 在 C++ 中,实现线程同步主要有以下几种常见方法
    互斥锁(Mutex)原理:互斥锁用于保护共享资源,确保在同一时刻只有一个线程能够访问被保护的资源。当一个线程想要访问共享资源时,它首先尝试获取互斥锁。如果锁已经被其他线程持有,那么该线程会被阻塞,直到锁被释放。一旦获取到锁,线程就可以安全地访问共享资源,访问结束后再释放锁,以便其......
  • 静态变量在多线程环境下的初始化是线程安全的吗?
    C++11之前的情况在C++11之前,标准并没有对静态变量在多线程环境下的初始化提供线程安全保证。这意味着如果多个线程同时访问一个未初始化的静态变量,可能会导致初始化过程多次执行或者出现数据竞争等问题。例如,假设有一个函数包含一个静态局部变量:intgetValue(){static......
  • PHP中的多线程与并发编程:如何提高处理能力
    在现代的网络应用中,处理能力是评估系统性能的一个关键指标。随着用户数量的激增和数据量的增加,单线程程序往往难以满足高并发的需求。虽然PHP本身是单线程的,但通过合理的多线程与并发编程技巧,我们依然可以提高处理能力,提升程序的响应速度和稳定性。理解PHP的并发模型是至关重要的......
  • 线程池创建方式
    线程池创建方式  一、方式一:通过ThreadPoolExecutor构造函数来创建(推荐)  方式二:通过Executor框架的工具类Executors来创建。  Executors工具类提供的创建线程池的方法如下图所示:  可以看出,通过Executors工具类可以创建多种类型的线程池,包括:  1. Fixed......