【问题标题】:how many threads to use in unit tests?在单元测试中使用多少个线程?
【发布时间】:2012-08-28 13:07:12
【问题描述】:

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

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

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

【问题讨论】:

  • 明确一点:我认为效率不是这个问题的主要问题,对吗? (似乎答案集中在这方面,尽管这似乎不是您的意图)
  • 或许可以看看之前的一个问题:stackoverflow.com/questions/12159/…
  • 无法保证您会使用单元测试找到多线程错误。如果测试失败,您就发现了问题,如果通过,则可能是测试碰巧起作用了。我会尝试不同的选项,看看你认为最有可能失败的选项。

标签: java multithreading unit-testing


【解决方案1】:

我一般跑3组测试:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      您应该估计在生产中实际同时运行的线程数,然后大大超出该数字。

      【讨论】:

        猜你喜欢
        • 2010-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多