白盒测试中如何实现真正意义上并发测试(Java)
在这个话题开始之前,首先我们来弄清楚为什么要做并发测试?
一般并发测试,是指模拟并发访问,测试多用户并发访问同一个应用、模块、数据时是否产生隐藏的并发问题,如内存泄漏、线程锁、资源争用问题。
站在性能测试的角度,并发测试不是为了获得性能指标,而是为了发现并发引起的问题。
那么并发对应的技术实现到底是怎样的呢?
简单地说,并发是指多个进程或线程在某一时刻同时处理指定的操作,有点类似于性能测试中集合点的概念,讲究同时性。
普及到这里,接下来讨论技术实现:
最近在项目里面发现一些开发人员做动态测试模拟500并发时,实现代码如下:
代码片段1:
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int i=0;i<500;i++){
new MyThread().run();
}
}
static class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
// 定义每个线程负责的业务逻辑实现
}
}
因为涉及一些共享对象的使用,避免多线程乱序现象,我建议加上同步锁,后来开发人员改写了代码,实现如下:
代码片段2:
public static void main(String[] args) {
// TODO Auto-generated method stub
// 定义线程池,模拟500并发请求
ThreadPoolExecutor executor = new ThreadPoolExecutor(500, 500, 1000,
TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(500),
new ThreadPoolExecutor.DiscardOldestPolicy());
for(int i=0;i<500;i++){
executor.execute(new MyThread());
}
executor.shutdown();
}
static class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
// 定义每个线程负责的业务逻辑实现
synchronized (this) {
}
}
}
其实上述这种方式在CPU层面采用的是FIFO策略(先进先出),线程是依次拿到锁资源进行处理的,无法达到同时性,所以我决定自己来做白盒测试,使用下面2种方式来实现:CyclicBarrier 和 CountDownLatch .
代码片段3:
public static void main(String[] args) {
// TODO Auto-generated method stub
CountDownLatch cdl = new CountDownLatch(500);
for (int i = 0; i < 500; i++) {
new MyThread(cdl).run();
}
try {
cdl.await();//调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
static class MyThread implements Runnable {
private CountDownLatch cdl;
public MyThread(CountDownLatch cdl) {
this.cdl = cdl;
}
@Override
public void run() {
// TODO Auto-generated method stub
cdl.countDown();//将count值减1
// 定义每个线程负责的业务逻辑实现
}
}
上面每个线程都共享了一个计数器,减1后调用await()方法挂起,直到count减为0时,才一起继续执行;
代码片段4:
public static void main(String[] args) {
// TODO Auto-generated method stub
CyclicBarrier cb = new CyclicBarrier(500);
ExecutorService es = Executors.newFixedThreadPool(500);
for (int i = 0; i < 500; i++) {
es.execute(new MyThread(cb));
}
es.shutdown();
}
static class MyThread implements Runnable {
private CyclicBarrier cb;
public MyThread(CyclicBarrier cb) {
this.cb = cb;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
// 等待所有任务准备就绪
cb.await();
// 定义每个线程负责的业务逻辑实现
} catch (Exception e) {
e.printStackTrace();
}
}
}
所有线程创建完毕后调用await()方法挂起,直至所有线程都到达barrier状态再同时执行;
声明:在这里,CyclicBarrier的barrier状态是可重用的,而CountDownLatch是不可重用的,个人还是推荐CyclicBarrier,因为性能上损耗较小些!
今天就总结到这了~~
白盒测试中如何实现真正意义上并发测试(Java)的更多相关文章
- 并发测试 java.lang.OutOfMemoryError: GC overhead limit exceeded Xms Xmx 阻塞请求 单节点 请求分发 负载均衡
at javax.servlet.http.HttpServlet.service(HttpServlet.java:705) at javax.servlet.http.HttpServlet.se ...
- Appium Grid并发测试
背景 Selenium玩的比较6的同学比较清楚:在Selenium中三大组件中有包含了Selenium Grid,而其作用就是分布式执行测试用例.主要的应用场景在于: 缩短测试执行时间,提高自动化测试 ...
- 真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合
真正意义上的spring环境中的单元测试方案spring-test与mokito完美结合 博客分类: java 测试 单元测试SpringCC++C# 一.要解决的问题: spring环境中 ...
- OS X 和iOS 中的多线程技术(上)
OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...
- MySQL 并发测试中,线程数和数据库连接池的实验
我一直以来,对性能测试中,连接池的大小要如何配置,不是太清楚: 就我所知道的,就DB自带对连接数的限制,在sqlserver中用select @@connection 可以查到, 在代码中,可以配置D ...
- SQLSERVER中KeyHashValue的作用(上)
SQLSERVER中KeyHashValue的作用(上) SQLSERVER中KeyHashValue的作用(下) 原文的标题是:SQLSERVER在索引下如何找到哈希值的随想 现在知道KeyHash ...
- 【 Linux 】单台服务器上并发TCP连接数
单台服务器上并发TCP连接数 问题:一台服务器到底能够支持多少TCP并发连接呢? 1. 文件描述符限制: 对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的 ...
- 【 Linux 】单台服务器上并发TCP连接数(转)
单台服务器上并发TCP连接数 问题:一台服务器到底能够支持多少TCP并发连接呢? 1. 文件描述符限制: 对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的 ...
- Windows中DLL文件的意义及其作用
Windows中DLL文件的意义及其作用 DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件即动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和 ...
随机推荐
- 【转】unity 移动物体到指定位置的四种方法
http://blog.csdn.net/lcy0221/article/details/44040739 方法1:使用Vector3.MoveTowards </pre><pre ...
- [SCOI2007][bzoj1070] 修车 [费用流]
题面 传送门 思路 我们考虑某个工人修车的从前到后序列如下: ${W_1,W_2,W_3,...,W_n}$ 那么,对于这n辆车的车主而言,他们等候的总时间为: $\sum_{i=1}^{n}W_i\ ...
- 【线性基】51nod1312 最大异或和&LOJ114 k大异或和
1312 最大异或和 题目来源: TopCoder 基准时间限制:1 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 有一个正整数数组S,S中有N个元素,这些元素分别是S[0] ...
- BZOJ2194 快速傅立叶之二 【fft】
题目 请计算C[k]=sigma(a[i]*b[i-k]) 其中 k < = i < n ,并且有 n < = 10 ^ 5. a,b中的元素均为小于等于100的非负整数. 输入格式 ...
- shell变量的数值计算
shell中常见的算术运算命令如下 1.(()) 用于整数运算的常用运算符,效率很高 2.let 用于整数运算,类似于 (()) 3.expr 可用于整数计算,但还有很多其他的额外功能 4.bc ...
- 用email实现邮件模板
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- android的布局-----LinearLayout(线性布局)
学习导图(图片在网上下载) 知识点详解(演示效果方便组件没有设置id) (1)gravity和Layout_gravity android:gravity 属性是对该view中内容的限定.比如一个bu ...
- C#图解教程学习笔记——委托
一.委托概述委托和类一样,是用户自定义类型,也是引用类型.但类表示的是数据和方法的集合,而委托持有一个或多个方法,以及一系列预定义操作. 可以通过以下操作步骤来使用委托:(1)声明一个委托类型.委托声 ...
- Scala 封装可break和continue的foreach循环
发现scala里没有break和continue, 有时候实在是需要的话就要自己try catch异常,代码看起来有点蛋疼, 所以封装了一个可break和continue的foreach. impor ...
- springBoot Json
pom 加json配置 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson ...