【发布时间】:2012-08-15 23:14:58
【问题描述】:
可能重复:
How should I unit test threaded code?
Guidelines for testing multithreaded code or ensuring that code is thread-safe
是否可以“单元测试”一个简单的类是否是线程安全的?
我的具体情况是一个简单的类,它对向量进行子集:给定要保留的向量位置的“白名单”和一个输入向量,它会生成一个输出向量,其中仅包含白名单中位置的值。我想编写一个单元测试(如果可能的话)以确保如果我们将来重构这个类,我们会保持它的线程安全。如果该类不再是线程安全的,则单元测试将失败。我意识到这有点模糊和定义不足。
【问题讨论】:
-
唯一可以确定的方法是通过一些密集的线程测试来实际运行它,这些测试旨在捕获诸如竞争条件和丢弃值之类的东西。
-
但它会可靠地工作吗?测试是否只是有时会失败?
-
你不能通过测试证明一个类是线程安全的。您只能尝试对其进行压力测试,希望如果您有并发错误,它们会出现,但不能保证它们会出现。
-
针对线程问题进行单元测试的问题在于,您的测试工具实际上总是具有与实际应用程序不同的时序行为(以及 CPU 和内存行为),而线程问题通常对这些事情很敏感。这是因为诸如无死锁和活跃性之类的东西是全局属性,而不是(通常)组件级属性。
标签: java multithreading thread-safety