由于并发代码中发生的错误一般都是低概率事件,所以在测试并发错误时需要反复地执行许多次,但有些方法可以提高发现这些错误的概率 ,在前面提到过,在多处理器系统上,如果 处理器的数量少于活动线程的数量,那么 与单处理器的系统 或者 包含多个处理器的系统相比,将能产生更多的交替行为。
有一种有用的方法能提高交替操作的数量。以便能更有效的搜索程序的状态空间:就是在访问状态的操作中加上Thread.yield作为一个空操作。当代码在访问状态的时候没有使用足够的同步,将存在一些对执行时序敏感的错误,通过在某个操作的执行过程 中调用yield方法,可以将这些错误暴露出来。这种方法需要在测试 中添加一些调用并且在正式产品吕删除这些调用 。
public synchronized void tranferCredits(Account from,Account to,int amount) { from.setBalance(from.getBalance()-amount); if (random.nextInt(1000)>THRESHOLD) { Thread.yield(); } to.setBalance(to.getBalance()+amount); }
性能测试要符合当前程序的应用场景,理想情况下应该反映出被测试对象的在应用程序中的实际用法。
第二个目标就是根据经验值来调整各种不同的限值,例如线程数量,缓存容量等等,这些限值都依赖于平台特性,我们通常要合理的选择这些值,使程序能够在更多的系统上良好的运行。
测试结果表明,LinkedBlockgingQueue的可伸缩性要高于ArrayBlockingQueue,初看起来这个结果似乎有些奇怪,链表队列在每次插入元素时,都必须分配一个链表节点对象 ,这似乎比基于数组的队列相比,链表队列的put和take等方法支持并发性更高的访问,因为一些优化后的链接队列算法能将队列头节点的更新 操作与尾节点的更新操作分享开来。因此如果算法能通过多执行一些内存分配操作来降低竞争 程度,那么这种算法通常具有更高的可伸缩性。
原文地址:http://blog.csdn.net/lingchixin/article/details/39324327