我正在对线程安全类进行单元测试。我从不同的线程调用它的方法,以确保它们都收到相同的结果(简而言之)。这就是我决定使用多少线程的方式:
int threads = Runtime.getRuntime().availableProcessors() * 4;
这是一个好习惯吗?我应该使用多少?越多越好?
我正在对线程安全类进行单元测试。我从不同的线程调用它的方法,以确保它们都收到相同的结果(简而言之)。这就是我决定使用多少线程的方式:
int threads = Runtime.getRuntime().availableProcessors() * 4;
这是一个好习惯吗?我应该使用多少?越多越好?
我通常运行 3 组测试:
对于多线程测试,我尝试最大化交错,通常通过使用 CountDownLatch 同步任务的开始,以便所有线程或多或少同时启动它们的任务。
我还尝试在测试期间避免额外的同步(例如,通过使用线程安全结构来存储一些结果),因为它可能会人为地“重新同步”测试代码 - 需要根据具体情况进行评估。
JCiP的第 12 章是高效多线程测试的一个很好的灵感来源(即提供了许多引发并发错误的提示)。
最后,正如@PeterLawrey 所指出的,您不能保证您的代码在测试中是线程安全的,您只能尝试增加发现并发错误的机会。
这取决于线程执行了多少 IO。对于 CPU 密集型任务,每 1 个内核 1 个线程很好,但如果您正在等待 IO 任务,例如数据库读/写操作、文件操作 - 将数量增加到每个内核 2 个或更多线程是安全的。只需测量性能,您将获得测试的最佳价值 :)
线程问题通常很少出现,所以想法是,你越强调它,你就越会带出竞争条件、争用问题等。
所以 4 * #processors 可能不会给你非常有意义的结果。事实上,它甚至可能会让你产生一种一切正常的错觉。
您应该估计在生产中实际上将同时运行多少线程,然后大大超出该数量。