java - 在 Java 中单元测试线程安全的任何令人满意的方法?

标签 java multithreading thread-safety

我正在考虑改进一个包,当它的输入在多个工作线程之间共享时,我认为它不是线程安全的。根据 TDD 原则,我应该编写一些一开始就失败的测试,这些测试肯定对评估问题很有用。

我意识到这不是一件容易实现的事情,而且天真地,多线程测试将是不确定的,因为操作系统将确定调度和各种操作交错的确切顺序。我已经查看并使用了MultithreadedTC过去,这很有用。但是,在那种情况下,我提前知道现有实现在哪里失败,因此能够编写一组很好的测试来涵盖它。

但是,如果您还没有确切地知道问题出在哪里,是否有一种很好的方法来编写一个很有可能引发任何潜在问题的测试?是否有其他人发现有帮助的库?我认为从纯粹主义者的角度来看,多线程测试用例应该是与通常的单线程测试相同的调用和断言,我是否正确地认为,只在适当的情况下使用多个工作线程运行?

欢迎提供任何有关工具/最佳实践/一般理念的报价。

最佳答案

Java Concurrency in Practice有一些关于如何为并发问题编写测试的重要信息。但是,它们不是真正的单元测试。几乎不可能为并发问题编写真正的单元测试。

基本上可以归结为这一点。创建一堆测试线程并启动它们。每个线程都应该

  • 等待倒计时锁存器
  • 反复调用一些修改相关可变状态的方法
  • 倒计时第二个闩锁并退出

junit 线程创建所有线程并启动它们,然后在第一个锁存器上倒计时一次以让它们全部离开,然后等待第二个锁存器,然后对可变状态进行一些断言。

比其他类型的错误更重要的是,在您发现错误之后为并发错误编写失败的单元测试更容易。

关于java - 在 Java 中单元测试线程安全的任何令人满意的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/424516/

相关文章:

java - Google map v2 膨胀 XML 时出错

java - 安卓工作室 : Error:Execution failed for task

multithreading - SLURM 节点、任务、核心和 CPU

multithreading - 为什么当子程序很昂贵时多线程执行不起作用?

java - getComponentNames 没有这样的方法错误

java - 在线程实例上使用 sleep(long) 的副作用

c++ - 多线程光线追踪器的噪声

c++ - tbb::concurrent_unordered_map::unsafe_erase 是否会使任何现有的迭代器失效?

multithreading - TThreadList和 “with”语句

java - CPU 未列为使用 Windows 的设备