在Java中测试线程安全性

17 浏览
0 Comments

在Java中测试线程安全性

这个问题已经有了答案:

可能的重复:

如何对多线程代码进行单元测试?

测试多线程代码的准则或确保代码是线程安全的

是否有可能对一个简单类进行“单元测试”,以确定其是否线程安全?

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

admin 更改状态以发布 2023年5月22日
0
0 Comments

这恰恰是Java Pathfinder的用途。它的学习曲线有点陡峭,但是用这个工具建立全面的证明确实是可能的。你建立一个场景并使用JPF运行,然后JPF会探索所有可能的线程顺序以查找可能的错误。你需要在你的程序中建立断言让JPF来检查。JPF在执行过程中假定顺序一致性,但你可以使用Java Racefinder插件来证明这一点。

诚然,建立一个正确的证明是困难的,但是确实有可能。如果什么都不做,JPF可以用来帮助你查找一些可能会错过的并发错误。

0
0 Comments

“线程安全”是一个类具有或不具有的属性。具体上下文而言,“线程安全”可能意味着没有竞争条件,按照特定的顺序执行代码或其他内容。

测试不能证明缺陷的不存在,只能揭示它们的存在。在我(并不非常丰富的)确保多线程代码正确性的经验中,最好的建议可能是尽可能简单清晰地编写代码,并尝试通过检查发现缺陷。重复运行测试也帮助不大。

0