【发布时间】:2021-12-18 18:13:23
【问题描述】:
我正在开发一个使用HashMap 共享状态的应用程序。我需要通过单元测试来证明它在多线程环境中会出现问题。
我尝试通过检查HashMap 的大小和元素在单线程环境和多线程环境中检查应用程序的状态。但这似乎没有帮助,状态总是一样的。
有没有其他方法可以证明或证明在地图上执行操作的应用程序可以很好地处理并发请求?
【问题讨论】:
-
这基本上是不可能的:你不能按需强制竞争条件。
-
IBM 拥有/拥有一个名为 ConTest 的工具,该工具可以编织您的字节码,从而使竞争条件更加普遍。我敢打赌它很快就会发现
HashMap的问题。不过,我现在找不到它;可能是他们摆脱了它,或者将它整合到一个(可能是专有的)软件包中。 -
为了获得高可靠性,与测试相比,我在实际代码证明方面的运气更好。举个例子,我开发了一个系统,该系统需要 6 周的时间在一夜之间反复运行完全相同的测试,以揭示一个比赛条件。
-
仅仅因为它“运行良好”并不能使它成为线程安全的。您可以使用工具来帮助查找线程安全错误,但您无法通过实验证明某些东西是线程安全的。您必须了解代码及其在做什么。有些人曾经通过测量 10 个圆圈并得出一个分数在这些情况下效果很好,从而“证明”了 PI 是一个分数。 ;)
-
你可以用几个嵌套的for循环并行流来猛击代码。如果你有足够的循环,从技术上讲,测试仍然是不稳定的,但重现错误的可能性会大大增加。我用它来证明我们使用单元测试的一些代码存在一些线程安全问题。
标签: java multithreading unit-testing hashmap