第12章 测试并发程序(Java并发编程实践笔记四)

第12章 测试并发程序
并发类的测试基本分为两类,以安全性与活跃度的测试。
与活跃度测试相关的是性能测试。性能可以通过很多方式来测量,其中包括:
吞吐量:在一个并发任务集里,已完成任务所占的比例;
响应性:从请求到完成一些动作之间的延迟(也被称为等待时间)
可伸缩性:增加更多的资源(通常是指CPU),就能提高(或者缓解短缺)吞吐量。


为并发类创建有效的安全测试,其挑战在于:如何在程序出现问题并导致某些属性极度可能失败时,简单地识别出这些受检查的属性来,不

要人为地让查找错误的代码限制住程序的并发性。最好能做到在检查测试的属性时,不需要任何的同步。

测试应该在多处理器系统上运行,以提高潜在交替运行的多样性。但是,多个CPU未必会使测试更加高效。为了能够最大程度地检测到时序

敏感的数据竞争的发生机会,应该让测试中的线程数多于CPU数,这样在任何给定的时间里,都有一些线程在运行机制,一些被交换出执行队列,这样

可以增加线程间交替行为的随机性。

编写有效的性能测试,就需要哄骗优化器不要把你的基准测试当作死代码而优化掉。这需要每一个计算的结果都要应用在你的程序中-以一种

不需要的同步或真实计算的方式。一种方式为:
if (str.hashCode() == System.nanoTime())
System.out.println();
总结:
测试并发程序的正确性是一项极大的挑战,因为并发程序很多可能的失败模式都是低可能性的事件,它们很容易受到时序、加载和其他一些

难以再现的条件的影响。更进一步而言,在测试基础架构时,还会引入额外的同步或者分时的约束,这些会屏蔽被测代码中的并发问题。测试并发程序

的性能同样是一项的挑战;比起用像C这样静态编译语言编写的程序,Java程序格外地难以测试,因为动态编译、垃圾回收以及自动的优化,都会影响

对时间的测量。
为了尽可能发现bug,避免在生产环境中才发现它们,应该在运用传统的测试技术(谨慎地避免这里讨论过的各种缺陷)的同时,结合代码审

查和自动化分析工具。每种技术都会发现其他技术可能忽略掉的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值