8

可能重复:
我应该如何对线程代码进行单元测试?
测试多线程代码或确保代码是线程安全的指南

是否可以“单元测试”一个简单的类是否是线程安全的?

我的具体情况是一个简单的类,它对向量进行子集:给定一个要保留的向量位置的“白名单”和一个输入向量,它会生成一个输出向量,其中仅包含白名单中位置的值。我想编写一个单元测试(如果可能的话),以确保如果我们将来重构这个类,我们会保持它的线程安全。如果该类不再是线程安全的,则单元测试将失败。我意识到这有点模糊和定义不足。

4

2 回答 2

5

这正是Java Pathfinder的用途。它的学习曲线有点陡峭,但实际上可以使用此工具构建详尽的证明。您构建一个场景并使用 JPF 运行它,然后 JPF 探索所有可能的线程顺序以查找可能的错误。您需要在程序中构建断言以供 JPF 检查。JPF 在执行期间假定顺序一致性,但您也可以使用 Java Racefinder 插件来证明这一点。

诚然,很难建立一个适当的证明——但这是可能的。如果没有别的,JPF 可以用来帮助您根除一些您可能会错过的并发错误。

于 2012-08-20T16:42:17.230 回答
5

线程安全是类具有或不具有的属性。线程安全可能意味着,取决于上下文,没有竞争条件,以特定顺序执行代码或其他任何东西。

测试不能证明没有错误,它只能揭示它们。在我确保多线程代码正确的(不是那么广泛的)经验中,最好的提示可能是保持代码尽可能简单和清晰,并尝试通过检查发现错误。重复运行测试不会有太大帮助。

于 2012-08-20T16:30:02.413 回答