在Java中测试线程安全性

Fra*_*ank 8 java multithreading thread-safety

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

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

我的具体情况是一个简单的类,即子集向量:给定要保持的向量位置的"白名单"和输入向量,它产生一个输出向量,其中只有白名单中位置的值.我想写一个单元测试(如果可能的话)以确保如果我们将来重构这个类,我们保持它的线程安全.如果类不再是线程安全的,单元测试将失败.我意识到这有点模糊,并且在定义之下.

Tud*_*dor 5

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

测试不能证明没有错误,它只能揭示它们.在确保多线程代码正确的我(不那么广泛)的经验中,最好的建议是尽可能保持代码尽可能简单明了,并尝试通过检查发现错误.反复运行测试无济于事.


Dao*_*Wen 5

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

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