并发编程11-测试并发程序
测试的两个方面:
- 安全性 并发不会造成状态错误。
- 活跃度 主要是性能测试
- 吞吐量 段时间定资源内可以处理的任务数量
- 响应性 从请求到完成一些动作之前的延迟(等待执行的时间)
- 可伸缩性 增加资源,提高性能
正确性测试
所有加入队列的都会被执行:
一般的可行的办法是把加入队列的列表和消费的列表保存起来进行比较。但是因为会设计资源的并发,影响对本身的测试,比较好的办法是在队列中加入唯一的id,然后对id求和,消费时同样求和,来比较结果。这样能最小的影响实际要测试的结果。
public class PutTakeTest {private static final ExecutorService pool = Executors.newCachedThreadPool();private final AtomicInteger putSum = new AtomicInteger(0);private final AtomicInteger takeSum = new AtomicInteger(0);private final int nTrials, nPairs;private final BlockingQueue<Integer> queue;public static void main(String[] args) {new PutTakeTest(10000).test();}public PutTakeTest(int nTrials){nPairs = 10; // 生产者及消费者的个数this.nTrials = nTrials; // 每次生产或者消费多少个queue = new ArrayBlockingQueue<Integer>(10);}public void test(){for (int i = 0; i < nPairs; i++) {pool.execute(new Producer());pool.execute(new Consumer());}pool.shutdown();try {pool.awaitTermination(10, TimeUnit.SECONDS);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(putSum.get());System.out.println(takeSum.get());}class Producer implements Runnable{@Overridepublic void run() {int sum = 0;try {for (int i = 0; i < nTrials; i++) {int seed = new Random().nextInt(10000); // 随机数,用来做sum,最后跟消费者的sum做比较来确定所有入队的都已经被出队消费sum += seed;queue.put(seed);}} catch (InterruptedException e) {e.printStackTrace();}putSum.getAndAdd(sum);}}class Consumer implements Runnable{@Overridepublic void run() {int sum = 0;try {for (int i = 0; i < nTrials; i++) {int seed = queue.take();sum += seed;}} catch (InterruptedException e) {e.printStackTrace();}takeSum.getAndAdd(sum);}}
}
按照上面的代码,实际上出于并行状态的线程并不多,可以使用关卡这种类型的信号量,来让所有的线程同时启动,再同时计算,提升并发的操作。
性能
吞吐量
基于上面的代码,其实在最开始和最后加入时间差的计算就可以粗略估算了
另外还可以借助关卡的特性,在最后回调的时候得到时间
响应性
即完成一个任务所需要的时间
性能测试陷阱
如果测试过程中恰巧多次出发了垃圾回收,那么就有可能把gc的时间算到实际运行的实践中。解决办法
- 使用-verbose:gc来停止垃圾回收的运行
- 第二种就是运行足够长的时间了
另外动态编译也可能会造成数据的不准确,可以使用-xx:+PrintCompilation来查看动态编译的时间,长时间运行测试程序,减少动态编译的影响
另外要考虑不且实际的竞争程度, 影响吞吐量通常是因为边界清晰小人物,大部分的时间都来源于上线问切换,而对于一些锁竞争比较多的程序可能影响最大的是锁竞争的程度,要根据不同情况制定具体的策略。
代码检查
- 调用Thread.run,应该是.start
- 显示锁未释放
- 空synchronized块
- 双检查锁, 因为可见性的问题及重排序的问题
- 从构造函数中启动线程,造成了this的溢出
- notify通常伴随着状态改变使用
- wait方法通常会出现在持有锁,循环以及含有测试某个状态的谓词(if())
- Thread.sleep会持有锁会对活跃度造成影响要注意
- 忙等待 while(a.equals(“”))这样的结果,如果域不是volatile的可能不会及时得到状态变更,可以使用锁通知等更好的方式。
并发编程11-测试并发程序相关推荐
- JavaWeb 并发编程 与 高并发解决方案
在这里写写我学习到和自己所理解的 Java高并发编程和高并发解决方案.现在在各大互联网公司中,随着日益增长的互联网服务需求,高并发处理已经是一个非常常见的问题,在这篇文章里面我们重点讨论两个方面的问题 ...
- 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...
不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...
- Java 高并发_JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过!...
JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程 没有项目经验的朋友不要错过! 1.JPG (37.82 KB, 下载次数: 0) 2018-12-3 09:40 上传 2.JPG (28 ...
- 01 - Java并发编程与高并发解决方案笔记-基础篇
01 - Java并发编程与高并发解决方案笔记-基础篇 基础篇很重要!很重要!很重要!!!一定要理解和认真思考. 01 - Java并发编程与高并发解决方案笔记-基础篇 1.课程准备 2.并发编程基础 ...
- 《Java并发编程入门与高并发面试》or 《Java并发编程与高并发解决方案》笔记
<Java并发编程入门与高并发面试>or <Java并发编程与高并发解决方案>笔记 参考文章: (1)<Java并发编程入门与高并发面试>or <Java并发 ...
- 并发编程-11线程安全策略之线程封闭
文章目录 脑图 概述 线程封闭的三种方式 示例 堆栈封闭 ThreadLocal Step1. ThreadLocal操作类 Step2. 自定义过滤器 Step3. 注册拦截器,配置拦截规则 Ste ...
- 高并发编程学习(1)——并发基础
一.前言 当我们使用计算机时,可以同时做许多事情,例如一边打游戏一边听音乐.这是因为操作系统支持并发任务,从而使得这些工作得以同时进行. 那么提出一个问题:如果我们要实现一个程序能一边听音乐一边玩游戏 ...
- java并发编程实践_Java并发编程实践如何正确使用Unsafe
一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...
- java 并发编程实例_Java并发编程案例解读
经过前面几节的学习,了解了多线程概念.Thread类的应用.多线程数据同步存在的问题及解决方法.本节给出一个并发编程实例应用案例,通过案例的学习,可以灵活地把多线程知识应用到实际编程中,解决在项目开发 ...
- 【Java并发编程】java并发框架Executor学习笔记
Java SE5的java.util.concurrent包中的执行器(Executor)将为你管理Thread对象,从而简化了并发编程.Executor在客户端和执行任务之间提供了一个间接层,Exe ...
最新文章
- [转载] 晓说——第21期:“看美国”系列之《日裔步兵团的奋战》
- lnmp ubuntu mysql装不上_ubuntu1.8安装lnmp失败
- Forefront Client Security部署前准备
- MySQL流程控制if、case、循环结构while的使用语法
- bat查看java进程 过滤_通过查找.BAT中使用的端口来终止进程
- 2020数字中国创新大赛—算法赛开源方案复盘笔记
- 牛客题霸 NC21 链表内指定区间反转
- MYSQL 从头开始-1
- python3 for循环_从零开始学习PYTHON3讲义(六)for循环跟斐波那契数列
- freemarker的测试结果框架_java必背综合知识点总结(框架篇)
- Python+VSCode是我的心头爱,飞一般的Coding体验!
- itertools编程训练
- 一篇文章带你搞定数学建模中的 Malthus人口模型(含代码)
- Nvidia Graphics Card Drive Download 英伟达显卡驱动花屏问题解决处理方式
- [python库]psd文件操作库--psd_tools
- 移动国际漫游电话费用计算
- 使用OpenCV和Python构建自己的车辆检测模型
- 米家扫地机器人充满电需要多长时间_【米家智能扫地机器人使用总结】APP|充电|电量|滚刷|厚度_摘要频道_什么值得买...
- 《拆掉思维里的墙》—— 读后总结
- 微信小程序 实现点击卡片 翻转效果