And*_*niy 5 java concurrency multithreading unit-testing thread-safety
我最近与我的一位同事(我非常尊重)进行了一场小型竞赛,讨论了测试一些代码是否是线程安全的理论可能性.
让我们假设我们FooUnknown从第三方库中获取了一些"黑盒子"类,因此我们无法访问其原始源代码.此外,它可能是内部使用一些本机方法(如果这是一个问题).
我们可以编写这样一个单元测试,告诉我们这个类的用法(例如,它在多个线程之间共享的实例)是100%线程安全的吗?
我的结论是,这是不可能的.对我而言,这是显而易见的:虽然可以编写一个代码,这将导致一些可能检测到的并发问题.但缺少这样的结果并不能保证根本没有并发问题.
我也相信,这个问题不是太宽泛.确切地说,我们说我们有一个类some.FooUnknown,我们希望以下列方式使用它:
@ApplicationScoped
public class FooService {
private some.FooUnkown foo = new some.FooUnknown();
public void someStuff() {
// ...
String result = foo.doSomeStuff();
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
如何测试它以确保它是线程安全的,我们不需要将其包装到ThreadLocal<FooUnknown>例如?