gpt4 book ai didi

java - 有没有办法测试方法处理并发调用的能力?

转载 作者:行者123 更新时间:2023-11-30 03:04:45 24 4
gpt4 key购买 nike

我有一个在数据库表中创建实体的方法。我想测试该方法同时被调用两次的场景。

该方法具有避免这种情况的逻辑,并使两个请求之一失败,但我无法确认它是否正常工作。

有没有办法在测试不不稳定的情况下对此进行测试?

我粗略地尝试从两个浏览器同时调用该操作,但它们不会并行执行。我想这需要大量的试验和错误才能让它们同时执行(这是一个在 tomcat 上运行的 war 文件)

最佳答案

测试测试。

获取应该是线程安全的方法的副本,并使该副本成为线程不安全的。编写一个单元测试,用一个可运行的程序启动十几个线程:
1) 拥有共享CountDownLatch
2) 等待 CountDownLatch 达到零。
3) 调用线程不安全方法。

使用 CountDownLatch,您可以触发所有线程或多或少同时调用线程不安全的方法(当 CountDownLatch 达到零时,所有线程都准备好从可运行对象中的同一点开始,但最终会上升)您的操作系统(和硬件)来决定何时执行什么)。评估结果:您现在应该看到差异(例如插入了 11 条记录,而不是您预期的 12 条)。

重复测试或将测试放入 for 循环中(并将 CountDownLatch 替换为 CyclicBarrier,这是用于此类测试的另一个并发工具)。在任何情况下,请确保您的测试始终显示不需要的结果(例如,永远不要假设线程同时启动,使用 CountDownLatch 等工具将它们同步,以便您确切地知道线程在哪里)。

在单元测试中将对线程不安全方法的调用替换为对线程安全方法的调用。您现在应该看到期望的结果和预期的结果,没有任何差异。

我在这里没有给出太多细节,但问题中也没有太多细节。无论如何,总体思路是首先设置一个应该出错的情况,并使用自动暴力破解(许多线程在循环中多次调用该方法)结合智能使用并发工具(如 CountDownLatch)来显示测试总会使某些问题浮出水面。 “智能使用并发工具”将需要一些时间、洞察力和实践(例如,我花了一些时间才弄清楚在调用“thread.start()”后线程可能尚未启动,并且可以使用 CountDownLatch以确保线程位于我想要的位置)。

免责声明:这些“经过测试的”测试不会捕获所有并发问题(您只测试您认为可能失败的内容,并且还有其他问题,例如损坏的 Double checked locking ),但它们会强化您的代码并带来可能会出现并发问题。

关于java - 有没有办法测试方法处理并发调用的能力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35072048/

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