java并发编程实战-并发程序的测试

1,并发测试大致分为两类:安全性测试与活跃性测试。安全性指的是“不发生任何错误的行为”,而活跃性定义为某个良好的行为终究会发生。
2,与活跃性测试相关的时性能测试,包括:吞吐量,响应性,可伸缩性。
3,正确性测试
  3.1,首先要找出需要检查的不变性条件和后验条件
  3.2,基本的单元测试,和串行测试类似
  3.3,对阻塞操作的测试。一种简单的方式是使用中断,启动一个阻塞操作,等到线程阻塞后再中断他,这要求阻塞方法能够提前返回或者抛出InterruptedException来响应中断
  3.4,尝试通过Thread.getState方法来验证线程的状态并不可靠
4,安全性测试
  4.1,测试安全性难度在于测试程序也必须是良好的并发程序,或许开发测试类比开发这些测试的并发程序更加困难
  4.2,在构建对并发类的安全性测试中,需要解决的关键问题在于,要找出那些容易检查的属性,这些属性在发生错误的情况下极有可能失败,同时又不会使得错误检查代码人为地限制并发性。理想情况是,在测试属性中不需要任何同步机制。
5,资源管理的测试
  5.1,测试的另一个方面就是要判断类中是否没有做它不应该做的事情,例如资源泄露
  5.2,对于任何持有或者管理其他对象的对象,都应该在不需要这些对象时消费对他们的引用。
6,使用回调,在线程生命周期一些关键位置上进行回调,非常适合判断不变性条件是否被破坏
7,产生更多的交替操作
8,性能测试

  8.1,性能测试通常是功能测试的延伸,同时通过性能测试能够根据经验值来调整各种不同的限制,是程序能够在更多的系统上良好的运行
  8.2,LinkedBlockingQueue的可伸缩性要高于ArrayBlackingQueue
9,避免性能测试的陷阱
  9.1,垃圾回收,一种方式避免垃圾回收,另一种方式是执行足够长的时间确保在测试期间执行多次垃圾回收。通常推荐后一种方式,这样的测试更接近真是环境性能
  9.2,动态编译,在HotSpot中,可以使用-xx:+PrintCompilation命令,当动态编译运行时将输出一条信息,可以通过这条信息验证动态编译实在测试运行前,而不是运行过程中执行
  9.3,对代码路径的不真实采样,动态编译器可能会针对一个单线程测试程序进行一些专门的优化,但只要在真实的应用程序中略微包含一些并行,都会使这些优化不复存在。因此测试程序时应该将单线程的性能测试与多线程的性能测试结合一起
  9.4,不真实的竞争程度,要获得有实际意义的结果,在并发性能测试中应该精良模拟典型应用程序的线程本地计算量以及鬓发协调开销。
  9.5,无用代码的消除,在HotSpot中,许多基准测试在-server模式下都能比在-client模式下运行得更好,因为在-server模式下,通过优化消除无用代码。
10,其他的测试方法
  10.1,代码审查
  10.2,静态分析工具,如FindBugs,FIndBugs包含的检查器中可以发现以下并发相关的错误模式:
    10.2.1,不一致的同步
    10.2.2,调用Thread.run,通常直接调用Thread.run都是错误的,而应该调用Thread.start
    10.2.3,未被释放的锁,显式锁的标准做法是在finally块中释放显式锁
    10.2.4,空的同步快
    10.2.5,双重检查加锁,虽然Java锁是可重入的,但是双重加锁是一种错误的习惯用法
    10.2.6,在构造函数中启动一个线程,这将导致this应用逸出
    10.2.7,错误的通知,如果在一个同步快中调用了notify或notifyAll,但是没有修改任何状态,那么就可能出错
    10.2.8,条件等待中的错误,如果在调用Object.wait或则Condition.await方法是没有持有锁,或者不在某个循环中,或没有检查某些状态谓词,那么通常是一个错误
    10.2.9,对Lock和Condition的吴用
    10.2.10,在休眠或者等待的同时持有一个锁
    10.2.11,自旋循环,当等待某个状态转换发生时,闭锁或条件等待通常是一个更好的技术。
11,AOP可以在确保不变性条件不被破坏的,或则与同步策略的某些方面保持一致
12,分析与监测工具





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值