gpt4 book ai didi

java - 潜在并发问题的单元测试

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:43 24 4
gpt4 key购买 nike

我最近与我的一位同事(我非常尊重他)就测试某些代码是否线程安全的理论上的可能性进行了一场小型竞赛。

让我们假设我们有一些“黑盒”类 FooUnknown取自第三方库,因此我们无法访问其原始源代码。此外,它可能在内部使用了一些本地方法(如果这是一个问题)。

我们能否编写这样一个单元测试来告诉我们此类的使用(例如,它的实例在多个线程之间共享)是否是 100% 线程安全的?

我的结论是,不可能。对我来说,这是显而易见和直接的:尽管可以编写一段代码,这将导致一些可以检测到的并发问题。但是没有这样的结果并不能保证根本没有并发问题。

而且我相信,这个问题不是太宽泛。可以肯定地说,我们有一个类 some.FooUnknown我们想按以下方式使用它:

@ApplicationScoped
public class FooService {
private some.FooUnkown foo = new some.FooUnknown();

public void someStuff() {
// ...
String result = foo.doSomeStuff();
// ...
}
}

如何测试它以确保它是线程安全的,我们不需要将它包装到 ThreadLocal<FooUnknown> 中例如?

最佳答案

抛开一切实际原因,这也是为什么理论上很难实现一套完整的并发安全测试:

假设有n 个线程在同一个数据结构上运行。然后任何线程 i 对该数据结构有一系列 Si 原子操作,其中每个序列可能有不同的长度。现在,您需要确保在理想环境中,您的测试涵盖了通过这些操作跨所有线程的每个可能的迭代序列。即使对于相对较小的操作序列并且只有 2 个线程,这个数字也会增长得相当快。

但现在困难的部分是将这些发现转化为一台真正的计算机。鉴于 jvms 的实现方式和 java 内存模型的自由度,识别此类原子操作本身就是一项复杂的任务。然后还有os控制的线程调度。因此,您通常无法控制在数据结构上发生的实际操作顺序。

关于java - 潜在并发问题的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47680844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com