2

我正在对线程安全类进行单元测试。我从不同的线程调用它的方法,以确保它们都收到相同的结果(简而言之)。这就是我决定使用多少线程的方式:

int threads = Runtime.getRuntime().availableProcessors() * 4;

这是一个好习惯吗?我应该使用多少?越多越好?

4

3 回答 3

6

我通常运行 3 组测试:

  • 一个线程检查单线程环境中的正确行为
  • 处理器数量 + 1(或任何典型的应用程序设置)
  • 许多线程(比如 1000 个)来增加上下文切换和争用

对于多线程测试,我尝试最大化交错,通常通过使用 CountDownLatch 同步任务的开始,以便所有线程或多或少同时启动它们的任务。

我还尝试在测试期间避免额外的同步(例如,通过使用线程安全结构来存储一些结果),因为它可能会人为地“重新同步”测试代码 - 需要根据具体情况进行评估。

JCiP的第 12 章是高效多线程测试的一个很好的灵感来源(即提供了许多引发并发错误的提示)。

最后,正如@PeterLawrey 所指出的,您不能保证您的代码在测试中是线程安全的,您只能尝试增加发现并发错误的机会。

于 2012-08-28T13:13:36.657 回答
0

这取决于线程执行了多少 IO。对于 CPU 密集型任务,每 1 个内核 1 个线程很好,但如果您正在等待 IO 任务,例如数据库读/写操作、文件操作 - 将数量增加到每个内核 2 个或更多线程是安全的。只需测量性能,您将获得测试的最佳价值 :)

于 2012-08-28T13:12:36.750 回答
0

线程问题通常很少出现,所以想法是,你越强调它,你就越会带出竞争条件、争用问题等。

所以 4 * #processors 可能不会给你非常有意义的结果。事实上,它甚至可能会让你产生一种一切正常的错觉。

您应该估计在生产中实际上将同时运行多少线程,然后大大超出该数量。

于 2012-08-28T13:22:23.810 回答